@salesforce/lds-runtime-aura 1.299.0 → 1.301.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 (29) hide show
  1. package/dist/ldsEngineCreator.js +287 -216
  2. package/dist/types/__mocks__/aura.d.ts +1 -1
  3. package/dist/types/__mocks__/force/ldsGraphqlParser.d.ts +1 -1
  4. package/dist/types/predictive-loading/common/index.d.ts +7 -0
  5. package/dist/types/predictive-loading/pages/lex-default-page.d.ts +1 -1
  6. package/dist/types/predictive-loading/pages/object-home-page.d.ts +1 -4
  7. package/dist/types/predictive-loading/pages/predictive-prefetch-page.d.ts +2 -4
  8. package/dist/types/predictive-loading/pages/record-home-page.d.ts +1 -4
  9. package/dist/types/predictive-loading/prefetcher/lex-predictive-prefetcher.d.ts +1 -1
  10. package/dist/types/predictive-loading/prefetcher/predictive-prefetcher.d.ts +12 -2
  11. package/dist/types/predictive-loading/prefetcher/utils.d.ts +16 -0
  12. package/dist/types/predictive-loading/repository/prefetch-repository.d.ts +3 -1
  13. package/dist/types/predictive-loading/request-strategy/get-apex-request-strategy.d.ts +7 -1
  14. package/dist/types/predictive-loading/request-strategy/get-components-request-strategy.d.ts +1 -1
  15. package/dist/types/predictive-loading/request-strategy/get-list-info-by-name-request-strategy.d.ts +1 -1
  16. package/dist/types/predictive-loading/request-strategy/get-list-infos-by-object-name-request-strategy.d.ts +1 -1
  17. package/dist/types/predictive-loading/request-strategy/get-list-records-by-name-request-strategy.d.ts +1 -1
  18. package/dist/types/predictive-loading/request-strategy/get-object-info-request-strategy.d.ts +0 -4
  19. package/dist/types/predictive-loading/request-strategy/get-object-infos-request-strategy.d.ts +15 -1
  20. package/dist/types/predictive-loading/request-strategy/get-record-actions-request-strategy.d.ts +1 -4
  21. package/dist/types/predictive-loading/request-strategy/get-record-avatars-request-strategy.d.ts +1 -4
  22. package/dist/types/predictive-loading/request-strategy/get-record-request-strategy.d.ts +1 -4
  23. package/dist/types/predictive-loading/request-strategy/get-records-request-strategy.d.ts +1 -4
  24. package/dist/types/predictive-loading/request-strategy/get-related-list-records-batch-request-strategy.d.ts +1 -4
  25. package/dist/types/predictive-loading/request-strategy/get-related-list-records-request-strategy.d.ts +1 -4
  26. package/dist/types/predictive-loading/request-strategy/get-related-lists-actions-request-strategy.d.ts +1 -4
  27. package/dist/types/predictive-loading/request-strategy/luvio-adapter-request-strategy.d.ts +15 -4
  28. package/dist/types/predictive-loading/request-strategy/request-strategy.d.ts +2 -5
  29. package/package.json +12 -12
@@ -19,6 +19,7 @@ import useApexPredictions from '@salesforce/gate/lds.pdl.useApexPredictions';
19
19
  import useRelatedListsPredictions from '@salesforce/gate/lds.pdl.useRelatedListsPredictions';
20
20
  import useCmpDefPredictions from '@salesforce/gate/lds.pdl.useCmpDefPredictions';
21
21
  import applyPredictionRequestLimit from '@salesforce/gate/lds.pdl.applyRequestLimit';
22
+ import useExactMatchesPlus from '@salesforce/gate/lds.pdl.useExactMatchesPlus';
22
23
  import { GetApexWireAdapterFactory, registerPrefetcher as registerPrefetcher$1 } from 'force/ldsAdaptersApex';
23
24
  import { instrument, getRecordAvatarsAdapterFactory, getRecordAdapterFactory, coerceFieldIdArray, getRecordsAdapterFactory, getRecordActionsAdapterFactory, getObjectInfosAdapterFactory, coerceObjectIdArray, getObjectInfoAdapterFactory, coerceObjectId, getRelatedListsActionsAdapterFactory, getRelatedListInfoBatchAdapterFactory, getRelatedListRecordsBatchAdapterFactory, getRelatedListRecordsAdapterFactory, getListInfoByNameAdapterFactory, getListInfosByObjectNameAdapterFactory, getListRecordsByNameAdapterFactory, configuration, InMemoryRecordRepresentationQueryEvaluator, UiApiNamespace, RecordRepresentationRepresentationType, registerPrefetcher } from 'force/ldsAdaptersUiapi';
24
25
  import { serviceBroker } from 'force/luvioServiceBroker4';
@@ -762,7 +763,7 @@ class LexDefaultPage extends PredictivePrefetchPage {
762
763
  super(context);
763
764
  }
764
765
  buildSaveRequestData(request) {
765
- return { context: this.context, request };
766
+ return [{ context: this.context, request }];
766
767
  }
767
768
  resolveSimilarRequest(similarRequest) {
768
769
  return similarRequest;
@@ -785,18 +786,18 @@ class RecordHomePage extends PredictivePrefetchPage {
785
786
  buildSaveRequestData(request) {
786
787
  const { adapterName } = request;
787
788
  const matchingRequestStrategy = this.requestStrategies[adapterName];
788
- if (matchingRequestStrategy) {
789
- return matchingRequestStrategy.buildSaveRequestData(this.similarContext, this.context, request);
789
+ if (matchingRequestStrategy === undefined) {
790
+ return [];
790
791
  }
791
- return { request, context: this.context };
792
+ return matchingRequestStrategy.buildSaveRequestData(this.similarContext, this.context, request);
792
793
  }
793
794
  resolveSimilarRequest(similarRequest) {
794
795
  const { adapterName } = similarRequest;
795
796
  const matchingRequestStrategy = this.requestStrategies[adapterName];
796
- if (matchingRequestStrategy) {
797
- return matchingRequestStrategy.buildConcreteRequest(similarRequest, this.context);
797
+ if (matchingRequestStrategy === undefined) {
798
+ return similarRequest;
798
799
  }
799
- return similarRequest;
800
+ return matchingRequestStrategy.buildConcreteRequest(similarRequest, this.context);
800
801
  }
801
802
  // Record Home performs best when we always do a minimal getRecord alongside the other requests.
802
803
  getAlwaysRunRequests() {
@@ -833,7 +834,7 @@ class ObjectHomePage extends PredictivePrefetchPage {
833
834
  if (matchingRequestStrategy) {
834
835
  return matchingRequestStrategy.buildSaveRequestData(this.similarContext, this.context, request);
835
836
  }
836
- return { request, context: this.context };
837
+ return [];
837
838
  }
838
839
  // no similar requests between LVs
839
840
  resolveSimilarRequest(similarRequest) {
@@ -1475,17 +1476,22 @@ class ApplicationPredictivePrefetcher {
1475
1476
  }
1476
1477
  startRecording() {
1477
1478
  this.isRecording = true;
1479
+ this.repository.markPageStart();
1478
1480
  this.repository.clearRequestBuffer();
1479
1481
  }
1480
1482
  saveRequest(request) {
1481
1483
  if (!this.isRecording) {
1482
- return Promise.resolve();
1484
+ return;
1483
1485
  }
1484
- return executeAsyncActivity(METRIC_KEYS.PREDICTIVE_DATA_LOADING_SAVE_REQUEST, (_act) => {
1485
- const { request: requestToSave, context } = this.page.buildSaveRequestData(request);
1486
- // No need to differentiate from predictions requests because these
1487
- // are made from the adapters factory, which are not prediction aware.
1488
- return this.repository.saveRequest(context, requestToSave);
1486
+ executeAsyncActivity(METRIC_KEYS.PREDICTIVE_DATA_LOADING_SAVE_REQUEST, (_act) => {
1487
+ const saveBuckets = this.page.buildSaveRequestData(request);
1488
+ saveBuckets.forEach((saveBucket) => {
1489
+ const { request: requestToSave, context } = saveBucket;
1490
+ // No need to differentiate from predictions requests because these
1491
+ // are made from the adapters factory, which are not prediction aware.
1492
+ this.repository.saveRequest(context, requestToSave);
1493
+ });
1494
+ return Promise.resolve().then();
1489
1495
  }, PDL_EXECUTE_ASYNC_OPTIONS);
1490
1496
  }
1491
1497
  async predict() {
@@ -1531,7 +1537,52 @@ class ApplicationPredictivePrefetcher {
1531
1537
  }
1532
1538
  }
1533
1539
 
1534
- function isCmpDefsRequest({ request: { adapterName }, }) {
1540
+ /**
1541
+ * Runs a list of requests with a specified concurrency limit.
1542
+ *
1543
+ * @template Request - The type of the requests being processed.
1544
+ * @param {RequestEntry<Request>[]} requests - An array of request entries to be processed in the array order.
1545
+ * @param {RequestRunner<Request>} runner - The runner instance responsible for executing the requests.
1546
+ * @param {number} concurrentRequestsLimit - The maximum number of concurrent requests allowed.
1547
+ * @param {number} pageStartTime - The start time of the page load, used to calculate the time elapsed since the page starts loading.
1548
+ * @returns {Promise<void>} A promise that resolves when all requests have been processed.
1549
+ *
1550
+ * This function manages a queue of pending requests and processes them with a concurrency limit.
1551
+ * Requests are only processed if their `requestTime` is less than the time elapsed since `pageStartTime`.
1552
+ */
1553
+ async function runRequestsWithLimit(requests, runner, concurrentRequestsLimit, pageStartTime) {
1554
+ // queue for pending prediction requests
1555
+ const requestQueue = [...requests];
1556
+ // Function to process the next request in the queue
1557
+ const processNextRequest = async () => {
1558
+ const timeInWaterfall = Date.now() - pageStartTime - 5; /* 5ms padding */
1559
+ while (requestQueue.length > 0 &&
1560
+ requestQueue[0].requestMetadata.requestTime < timeInWaterfall) {
1561
+ requestQueue.shift();
1562
+ }
1563
+ if (requestQueue.length > 0) {
1564
+ // (!) requestQueue will always have at least one element ensured by the above check.
1565
+ const nextRequest = requestQueue.shift();
1566
+ try {
1567
+ // Run the request and wait for it to complete
1568
+ await runner.runRequest(nextRequest.request);
1569
+ }
1570
+ finally {
1571
+ await processNextRequest();
1572
+ }
1573
+ }
1574
+ };
1575
+ // Start processing requests up to concurrentRequestsLimit
1576
+ const initialRequests = Math.min(concurrentRequestsLimit, requestQueue.length);
1577
+ const promises = [];
1578
+ for (let i = 0; i < initialRequests; i++) {
1579
+ promises.push(processNextRequest());
1580
+ }
1581
+ // Wait for all initial requests to complete
1582
+ await Promise.all(promises);
1583
+ }
1584
+
1585
+ function isCmpDefsRequest({ request: { adapterName } }) {
1535
1586
  return adapterName === 'getComponentsDef';
1536
1587
  }
1537
1588
  class LexPredictivePrefetcher extends ApplicationPredictivePrefetcher {
@@ -1563,7 +1614,7 @@ class LexPredictivePrefetcher extends ApplicationPredictivePrefetcher {
1563
1614
  const alwaysRequestEntries = alwaysRequests.map((request) => {
1564
1615
  return {
1565
1616
  request,
1566
- requestMetadata: { requestTime: 0 }, // ensures always requests are executed first.
1617
+ requestMetadata: { requestTime: 0 }, // ensures always requests are executed, and executed first.
1567
1618
  };
1568
1619
  });
1569
1620
  const reducedPredictions = this.requestRunner.reduceRequests([
@@ -1574,16 +1625,11 @@ class LexPredictivePrefetcher extends ApplicationPredictivePrefetcher {
1574
1625
  const nonCmpDefPredictions = reducedPredictions.filter((r) => !isCmpDefsRequest(r));
1575
1626
  const cmpDefPredictions = reducedPredictions.filter(isCmpDefsRequest);
1576
1627
  // Non CmpDefs requests are limited by AuraActions concurent inflight limit.
1577
- const reducedRequests = nonCmpDefPredictions
1578
- .sort((a, b) => a.requestMetadata.requestTime - b.requestMetadata.requestTime) // In future - choose sort algorithm via Gate?
1579
- .slice(0, this.options.inflightRequestLimit - alwaysRequests.length)
1580
- .map((entry) => entry.request);
1581
1628
  // Always requests must go by themself - Some of them are essential to keep the page rendering at the beginning.
1582
- const predictedRequestsWithLimit = [...alwaysRequests, ...reducedRequests];
1583
- this.queuedPredictionRequests.push(...predictedRequestsWithLimit);
1584
- const inflightPredictionRequests = predictedRequestsWithLimit.map((request) => this.requestRunner.runRequest(request));
1629
+ const predictedRequestsWithLimit = [...alwaysRequestEntries, ...nonCmpDefPredictions].sort((a, b) => a.requestMetadata.requestTime - b.requestMetadata.requestTime); // In future - choose sort algorithm via Gate?;
1630
+ const inflightPredictionRequests = runRequestsWithLimit(predictedRequestsWithLimit, this.requestRunner, this.options.inflightRequestLimit, this.repository.pageStartTime);
1585
1631
  const inflightCmpRequests = cmpDefPredictions.map((request) => this.requestRunner.runRequest(request.request));
1586
- return Promise.all([...inflightPredictionRequests, ...inflightCmpRequests]).then();
1632
+ return Promise.all([inflightPredictionRequests, ...inflightCmpRequests]).then();
1587
1633
  }
1588
1634
  }
1589
1635
 
@@ -1681,10 +1727,14 @@ class PrefetchRepository {
1681
1727
  constructor(storage) {
1682
1728
  this.storage = storage;
1683
1729
  this.requestBuffer = new Map();
1730
+ this.pageStartTime = Date.now();
1684
1731
  }
1685
1732
  clearRequestBuffer() {
1686
1733
  this.requestBuffer.clear();
1687
1734
  }
1735
+ markPageStart() {
1736
+ this.pageStartTime = Date.now();
1737
+ }
1688
1738
  async flushRequestsToStorage() {
1689
1739
  const setPromises = [];
1690
1740
  for (const [id, batch] of this.requestBuffer) {
@@ -1711,12 +1761,12 @@ class PrefetchRepository {
1711
1761
  getKeyId(key) {
1712
1762
  return stableJSONStringify(key);
1713
1763
  }
1714
- async saveRequest(key, request) {
1764
+ saveRequest(key, request) {
1715
1765
  const identifier = this.getKeyId(key);
1716
1766
  const batchForKey = this.requestBuffer.get(identifier) || [];
1717
1767
  batchForKey.push({
1718
1768
  request,
1719
- requestTime: Date.now(),
1769
+ requestTime: Date.now() - this.pageStartTime,
1720
1770
  });
1721
1771
  this.requestBuffer.set(identifier, batchForKey);
1722
1772
  }
@@ -1743,6 +1793,10 @@ class RequestStrategy {
1743
1793
  }
1744
1794
 
1745
1795
  class LuvioAdapterRequestStrategy extends RequestStrategy {
1796
+ constructor(options = {}) {
1797
+ super();
1798
+ this.prefetcherOptions = options;
1799
+ }
1746
1800
  /**
1747
1801
  * Perform any transformations required to prepare the request for saving.
1748
1802
  *
@@ -1839,14 +1893,34 @@ class LuvioAdapterRequestStrategy extends RequestStrategy {
1839
1893
  * - handling the cases where the request is context dependent (this is homework for the subclass)
1840
1894
  * @param _similarContext Context with at least one parameter as a wildcard '*'
1841
1895
  * @param context Exact context for a given page
1842
- * @param request
1843
- * @returns
1896
+ * @param request Request to build save request data for
1897
+ * @returns Save request data
1844
1898
  */
1845
- buildSaveRequestData(_similarContext, context, request) {
1846
- return {
1899
+ buildSaveRequestData(similarContext, context, request) {
1900
+ const saveRequestDataBuckets = [];
1901
+ if (this.isContextDependent(context, request)) {
1902
+ saveRequestDataBuckets.push({
1903
+ request: this.transformForSaveSimilarRequest(request),
1904
+ context: similarContext,
1905
+ });
1906
+ const useSaveBuckets = this.prefetcherOptions && this.prefetcherOptions.useSaveBuckets;
1907
+ if (!useSaveBuckets) {
1908
+ return saveRequestDataBuckets;
1909
+ }
1910
+ }
1911
+ saveRequestDataBuckets.push({
1847
1912
  request: this.transformForSave(request),
1848
1913
  context,
1849
- };
1914
+ });
1915
+ return saveRequestDataBuckets;
1916
+ }
1917
+ /**
1918
+ * Transforms the request for saving similar requests
1919
+ * @param request Request to transform for saving similar requests
1920
+ * @returns Transformed request
1921
+ */
1922
+ transformForSaveSimilarRequest(request) {
1923
+ return this.transformForSave(request);
1850
1924
  }
1851
1925
  }
1852
1926
 
@@ -1979,10 +2053,12 @@ class GetComponentsDefStrategy extends ConfigBasedRequestStrategy {
1979
2053
  };
1980
2054
  }
1981
2055
  buildSaveRequestData(similarContext, _context, request) {
1982
- return {
1983
- request: this.transformForSave(request),
1984
- context: similarContext,
1985
- };
2056
+ return [
2057
+ {
2058
+ request: this.transformForSave(request),
2059
+ context: similarContext,
2060
+ },
2061
+ ];
1986
2062
  }
1987
2063
  transformForSave(request) {
1988
2064
  return {
@@ -2021,23 +2097,14 @@ class GetRecordAvatarsRequestStrategy extends LuvioAdapterRequestStrategy {
2021
2097
  },
2022
2098
  };
2023
2099
  }
2024
- buildSaveRequestData(similarContext, context, request) {
2025
- if (this.isContextDependent(context, request)) {
2026
- return {
2027
- request: this.transformForSave({
2028
- ...request,
2029
- config: {
2030
- ...request.config,
2031
- recordIds: ['*'],
2032
- },
2033
- }),
2034
- context: similarContext,
2035
- };
2036
- }
2037
- return {
2038
- request: this.transformForSave(request),
2039
- context,
2040
- };
2100
+ transformForSaveSimilarRequest(request) {
2101
+ return this.transformForSave({
2102
+ ...request,
2103
+ config: {
2104
+ ...request.config,
2105
+ recordIds: ['*'],
2106
+ },
2107
+ });
2041
2108
  }
2042
2109
  isContextDependent(context, request) {
2043
2110
  return (request.config.recordIds &&
@@ -2117,23 +2184,14 @@ class GetRecordRequestStrategy extends LuvioAdapterRequestStrategy {
2117
2184
  isContextDependent(context, request) {
2118
2185
  return request.config.recordId === context.recordId;
2119
2186
  }
2120
- buildSaveRequestData(similarContext, context, request) {
2121
- if (this.isContextDependent(context, request)) {
2122
- return {
2123
- request: this.transformForSave({
2124
- ...request,
2125
- config: {
2126
- ...request.config,
2127
- recordId: '*',
2128
- },
2129
- }),
2130
- context: similarContext,
2131
- };
2132
- }
2133
- return {
2134
- request: this.transformForSave(request),
2135
- context,
2136
- };
2187
+ transformForSaveSimilarRequest(request) {
2188
+ return this.transformForSave({
2189
+ ...request,
2190
+ config: {
2191
+ ...request.config,
2192
+ recordId: '*',
2193
+ },
2194
+ });
2137
2195
  }
2138
2196
  }
2139
2197
 
@@ -2156,28 +2214,19 @@ class GetRecordsRequestStrategy extends LuvioAdapterRequestStrategy {
2156
2214
  const isSingleRecordRequest = request.config.records.length === 1 && request.config.records[0].recordIds.length === 1;
2157
2215
  return isSingleRecordRequest && request.config.records[0].recordIds[0] === context.recordId;
2158
2216
  }
2159
- buildSaveRequestData(similarContext, context, request) {
2160
- if (this.isContextDependent(context, request)) {
2161
- return {
2162
- request: this.transformForSave({
2163
- ...request,
2164
- config: {
2165
- ...request.config,
2166
- records: [
2167
- {
2168
- ...request.config.records[0],
2169
- recordIds: ['*'],
2170
- },
2171
- ],
2217
+ transformForSaveSimilarRequest(request) {
2218
+ return this.transformForSave({
2219
+ ...request,
2220
+ config: {
2221
+ ...request.config,
2222
+ records: [
2223
+ {
2224
+ ...request.config.records[0],
2225
+ recordIds: ['*'],
2172
2226
  },
2173
- }),
2174
- context: similarContext,
2175
- };
2176
- }
2177
- return {
2178
- request: this.transformForSave(request),
2179
- context: context,
2180
- };
2227
+ ],
2228
+ },
2229
+ });
2181
2230
  }
2182
2231
  }
2183
2232
 
@@ -2208,23 +2257,14 @@ class GetRecordActionsRequestStrategy extends LuvioAdapterRequestStrategy {
2208
2257
  },
2209
2258
  };
2210
2259
  }
2211
- buildSaveRequestData(similarContext, context, request) {
2212
- if (this.isContextDependent(context, request)) {
2213
- return {
2214
- request: this.transformForSave({
2215
- ...request,
2216
- config: {
2217
- ...request.config,
2218
- recordIds: ['*'],
2219
- },
2220
- }),
2221
- context: similarContext,
2222
- };
2223
- }
2224
- return {
2225
- request: this.transformForSave(request),
2226
- context,
2227
- };
2260
+ transformForSaveSimilarRequest(request) {
2261
+ return this.transformForSave({
2262
+ ...request,
2263
+ config: {
2264
+ ...request.config,
2265
+ recordIds: ['*'],
2266
+ },
2267
+ });
2228
2268
  }
2229
2269
  canCombine(reqA, reqB) {
2230
2270
  return (reqA.retrievalMode === reqB.retrievalMode &&
@@ -2254,6 +2294,14 @@ class GetRecordActionsRequestStrategy extends LuvioAdapterRequestStrategy {
2254
2294
  }
2255
2295
 
2256
2296
  const GET_OBJECT_INFO_BATCH_ADAPTER_NAME = 'getObjectInfos';
2297
+ /**
2298
+ * Returns true if A is a superset of B
2299
+ * @param a
2300
+ * @param b
2301
+ */
2302
+ function isSuperSet(a, b) {
2303
+ return b.every((oan) => a.has(oan));
2304
+ }
2257
2305
  class GetObjectInfosRequestStrategy extends LuvioAdapterRequestStrategy {
2258
2306
  constructor() {
2259
2307
  super(...arguments);
@@ -2273,6 +2321,51 @@ class GetObjectInfosRequestStrategy extends LuvioAdapterRequestStrategy {
2273
2321
  },
2274
2322
  };
2275
2323
  }
2324
+ /**
2325
+ * Reduces the given GetObjectInfosRequest requests by eliminating those for which config.objectApiNames
2326
+ * is a subset of another GetObjectInfosRequest.
2327
+ *
2328
+ * @param unfilteredRequests - Array of unfiltered requests
2329
+ * @returns RequestEntry<GetObjectInfosRequest>[] - Array of reduced requests
2330
+ */
2331
+ reduce(unfilteredRequests) {
2332
+ // Filter and sort requests by the length of objectApiNames in ascending order.
2333
+ // This ensures a superset of request (i) can only be found in a request (j) such that i < j.
2334
+ const objectInfosRequests = this.filterRequests(unfilteredRequests).sort((a, b) => a.request.config.objectApiNames.length - b.request.config.objectApiNames.length);
2335
+ // Convert request configurations to sets for easier comparison, avoiding a new set construction each iteration.
2336
+ const requestConfigAsSet = objectInfosRequests.map((r) => new Set(r.request.config.objectApiNames));
2337
+ const reducedRequests = [];
2338
+ // Iterate over each request to determine if it is a subset of others
2339
+ for (let i = 0, n = objectInfosRequests.length; i < n; i++) {
2340
+ const current = objectInfosRequests[i];
2341
+ const { request: { config: currentRequestConfig }, requestMetadata: currentRequestMetadata, } = current;
2342
+ let isCurrentSubsetOfOthers = false;
2343
+ // Check if the current request is a subset of any subsequent requests
2344
+ for (let j = i + 1; j < n; j++) {
2345
+ const possibleSuperset = objectInfosRequests[j];
2346
+ if (isSuperSet(requestConfigAsSet[j], currentRequestConfig.objectApiNames)) {
2347
+ isCurrentSubsetOfOthers = true;
2348
+ if (currentRequestMetadata.requestTime <
2349
+ possibleSuperset.requestMetadata.requestTime) {
2350
+ possibleSuperset.requestMetadata.requestTime =
2351
+ currentRequestMetadata.requestTime;
2352
+ }
2353
+ }
2354
+ }
2355
+ if (!isCurrentSubsetOfOthers) {
2356
+ reducedRequests.push(current);
2357
+ }
2358
+ }
2359
+ return reducedRequests;
2360
+ }
2361
+ buildSaveRequestData(similarContext, context, request) {
2362
+ return [
2363
+ {
2364
+ request: this.transformForSave(request),
2365
+ context,
2366
+ },
2367
+ ];
2368
+ }
2276
2369
  }
2277
2370
 
2278
2371
  class GetObjectInfoRequestStrategy extends LuvioAdapterRequestStrategy {
@@ -2290,18 +2383,6 @@ class GetObjectInfoRequestStrategy extends LuvioAdapterRequestStrategy {
2290
2383
  },
2291
2384
  };
2292
2385
  }
2293
- buildSaveRequestData(similarContext, context, request) {
2294
- if (this.isContextDependent(context, request)) {
2295
- return {
2296
- request: this.transformForSave(request),
2297
- context: similarContext,
2298
- };
2299
- }
2300
- return {
2301
- request: this.transformForSave(request),
2302
- context,
2303
- };
2304
- }
2305
2386
  transformForSave(request) {
2306
2387
  return {
2307
2388
  ...request,
@@ -2356,23 +2437,14 @@ class GetRelatedListsActionsRequestStrategy extends LuvioAdapterRequestStrategy
2356
2437
  },
2357
2438
  };
2358
2439
  }
2359
- buildSaveRequestData(similarContext, context, request) {
2360
- if (this.isContextDependent(context, request)) {
2361
- return {
2362
- request: this.transformForSave({
2363
- ...request,
2364
- config: {
2365
- ...request.config,
2366
- recordIds: ['*'],
2367
- },
2368
- }),
2369
- context: similarContext,
2370
- };
2371
- }
2372
- return {
2373
- request: this.transformForSave(request),
2374
- context,
2375
- };
2440
+ transformForSaveSimilarRequest(request) {
2441
+ return this.transformForSave({
2442
+ ...request,
2443
+ config: {
2444
+ ...request.config,
2445
+ recordIds: ['*'],
2446
+ },
2447
+ });
2376
2448
  }
2377
2449
  isContextDependent(context, request) {
2378
2450
  const isForContext = request.config.recordIds &&
@@ -2451,23 +2523,14 @@ class GetRelatedListRecordsBatchRequestStrategy extends LuvioAdapterRequestStrat
2451
2523
  },
2452
2524
  };
2453
2525
  }
2454
- buildSaveRequestData(similarContext, context, request) {
2455
- if (this.isContextDependent(context, request)) {
2456
- return {
2457
- request: this.transformForSave({
2458
- ...request,
2459
- config: {
2460
- ...request.config,
2461
- parentRecordId: '*',
2462
- },
2463
- }),
2464
- context: similarContext,
2465
- };
2466
- }
2467
- return {
2468
- request: this.transformForSave(request),
2469
- context,
2470
- };
2526
+ transformForSaveSimilarRequest(request) {
2527
+ return this.transformForSave({
2528
+ ...request,
2529
+ config: {
2530
+ ...request.config,
2531
+ parentRecordId: '*',
2532
+ },
2533
+ });
2471
2534
  }
2472
2535
  isContextDependent(context, request) {
2473
2536
  return context.recordId === request.config.parentRecordId;
@@ -2546,23 +2609,14 @@ class GetRelatedListRecordsRequestStrategy extends LuvioAdapterRequestStrategy {
2546
2609
  return !(batchForParentRecordId && batchForParentRecordId.has(relatedListId));
2547
2610
  });
2548
2611
  }
2549
- buildSaveRequestData(similarContext, context, request) {
2550
- if (this.isContextDependent(context, request)) {
2551
- return {
2552
- request: this.transformForSave({
2553
- ...request,
2554
- config: {
2555
- ...request.config,
2556
- parentRecordId: '*',
2557
- },
2558
- }),
2559
- context: similarContext,
2560
- };
2561
- }
2562
- return {
2563
- request: this.transformForSave(request),
2564
- context,
2565
- };
2612
+ transformForSaveSimilarRequest(request) {
2613
+ return this.transformForSave({
2614
+ ...request,
2615
+ config: {
2616
+ ...request.config,
2617
+ parentRecordId: '*',
2618
+ },
2619
+ });
2566
2620
  }
2567
2621
  isContextDependent(context, request) {
2568
2622
  return context.recordId === request.config.parentRecordId;
@@ -2583,6 +2637,14 @@ class GetApexRequestStrategy extends LuvioAdapterRequestStrategy {
2583
2637
  buildConcreteRequest(similarRequest) {
2584
2638
  return similarRequest;
2585
2639
  }
2640
+ buildSaveRequestData(_similarContext, context, request) {
2641
+ return [
2642
+ {
2643
+ request: this.transformForSave(request),
2644
+ context,
2645
+ },
2646
+ ];
2647
+ }
2586
2648
  }
2587
2649
 
2588
2650
  const GET_LIST_INFO_BY_NAME_ADAPTER_NAME = 'getListInfoByName';
@@ -2606,10 +2668,12 @@ class GetListInfoByNameRequestStrategy extends LuvioAdapterRequestStrategy {
2606
2668
  };
2607
2669
  }
2608
2670
  buildSaveRequestData(_similarContext, context, request) {
2609
- return {
2610
- request: this.transformForSave(request),
2611
- context,
2612
- };
2671
+ return [
2672
+ {
2673
+ request: this.transformForSave(request),
2674
+ context,
2675
+ },
2676
+ ];
2613
2677
  }
2614
2678
  canCombine(reqA, reqB) {
2615
2679
  return (reqA.objectApiName === reqB.objectApiName &&
@@ -2641,10 +2705,12 @@ class GetListInfosByObjectNameRequestStrategy extends LuvioAdapterRequestStrateg
2641
2705
  };
2642
2706
  }
2643
2707
  buildSaveRequestData(_similarContext, context, request) {
2644
- return {
2645
- request: this.transformForSave(request),
2646
- context,
2647
- };
2708
+ return [
2709
+ {
2710
+ request: this.transformForSave(request),
2711
+ context,
2712
+ },
2713
+ ];
2648
2714
  }
2649
2715
  canCombine(reqA, reqB) {
2650
2716
  return (reqA.objectApiName === reqB.objectApiName &&
@@ -2688,10 +2754,12 @@ class GetListRecordsByNameRequestStrategy extends LuvioAdapterRequestStrategy {
2688
2754
  return request;
2689
2755
  }
2690
2756
  buildSaveRequestData(_similarContext, context, request) {
2691
- return {
2692
- request: this.transformForSave(request),
2693
- context,
2694
- };
2757
+ return [
2758
+ {
2759
+ request: this.transformForSave(request),
2760
+ context,
2761
+ },
2762
+ ];
2695
2763
  }
2696
2764
  }
2697
2765
 
@@ -2700,21 +2768,21 @@ class LexRequestRunner {
2700
2768
  constructor(luvio) {
2701
2769
  this.luvio = luvio;
2702
2770
  this.requestStrategies = {
2703
- getRecord: new GetRecordRequestStrategy(),
2704
- getRecords: new GetRecordsRequestStrategy(),
2705
- getRecordActions: new GetRecordActionsRequestStrategy(),
2706
- getRecordAvatars: new GetRecordAvatarsRequestStrategy(),
2707
- getObjectInfo: new GetObjectInfoRequestStrategy(),
2708
- getObjectInfos: new GetObjectInfosRequestStrategy(),
2709
- getRelatedListsActions: new GetRelatedListsActionsRequestStrategy(),
2710
- getRelatedListInfoBatch: new GetRelatedListInfoBatchRequestStrategy(),
2711
- getRelatedListRecords: new GetRelatedListRecordsRequestStrategy(),
2712
- getRelatedListRecordsBatch: new GetRelatedListRecordsBatchRequestStrategy(),
2713
- getListInfoByName: new GetListInfoByNameRequestStrategy(),
2714
- getListRecordsByName: new GetListRecordsByNameRequestStrategy(),
2715
- getApex: new GetApexRequestStrategy(),
2716
- getComponentsDef: new GetComponentsDefStrategy(),
2717
- getListInfosByObjectName: new GetListInfosByObjectNameRequestStrategy(),
2771
+ getRecord: new GetRecordRequestStrategy({}),
2772
+ getRecords: new GetRecordsRequestStrategy({}),
2773
+ getRecordActions: new GetRecordActionsRequestStrategy({}),
2774
+ getRecordAvatars: new GetRecordAvatarsRequestStrategy({}),
2775
+ getObjectInfo: new GetObjectInfoRequestStrategy({}),
2776
+ getObjectInfos: new GetObjectInfosRequestStrategy({}),
2777
+ getRelatedListsActions: new GetRelatedListsActionsRequestStrategy({}),
2778
+ getRelatedListInfoBatch: new GetRelatedListInfoBatchRequestStrategy({}),
2779
+ getRelatedListRecords: new GetRelatedListRecordsRequestStrategy({}),
2780
+ getRelatedListRecordsBatch: new GetRelatedListRecordsBatchRequestStrategy({}),
2781
+ getListInfoByName: new GetListInfoByNameRequestStrategy({}),
2782
+ getListRecordsByName: new GetListRecordsByNameRequestStrategy({}),
2783
+ getApex: new GetApexRequestStrategy({}),
2784
+ getComponentsDef: new GetComponentsDefStrategy({}),
2785
+ getListInfosByObjectName: new GetListInfosByObjectNameRequestStrategy({}),
2718
2786
  };
2719
2787
  }
2720
2788
  reduceRequests(requests) {
@@ -2965,25 +3033,28 @@ function setupPredictivePrefetcher(luvio) {
2965
3033
  const inflightRequestLimit = applyPredictionRequestLimit.isOpen({ fallback: false })
2966
3034
  ? HARDCODED_REQUEST_LIMIT
2967
3035
  : 1000;
2968
- const prefetcher = new LexPredictivePrefetcher({ context: 'unknown' }, repository, requestRunner, {
2969
- getRecord: new GetRecordRequestStrategy(),
2970
- getRecords: new GetRecordsRequestStrategy(),
2971
- getRecordActions: new GetRecordActionsRequestStrategy(),
2972
- getRecordAvatars: new GetRecordAvatarsRequestStrategy(),
2973
- getObjectInfo: new GetObjectInfoRequestStrategy(),
2974
- getObjectInfos: new GetObjectInfosRequestStrategy(),
2975
- getRelatedListsActions: new GetRelatedListsActionsRequestStrategy(),
2976
- getRelatedListRecords: new GetRelatedListRecordsRequestStrategy(),
2977
- getRelatedListRecordsBatch: new GetRelatedListRecordsBatchRequestStrategy(),
2978
- getRelatedListInfoBatch: new GetRelatedListInfoBatchRequestStrategy(),
2979
- getListInfoByName: new GetListInfoByNameRequestStrategy(),
2980
- getListRecordsByName: new GetListRecordsByNameRequestStrategy(),
2981
- getApexStrategy: new GetApexRequestStrategy(),
2982
- getComponentsDef: new GetComponentsDefStrategy(),
2983
- getListInfosByObjectName: new GetListInfosByObjectNameRequestStrategy(),
2984
- }, {
3036
+ const useSaveBuckets = useExactMatchesPlus.isOpen({ fallback: false });
3037
+ const prefetcherOptions = {
2985
3038
  inflightRequestLimit,
2986
- });
3039
+ useSaveBuckets,
3040
+ };
3041
+ const prefetcher = new LexPredictivePrefetcher({ context: 'unknown' }, repository, requestRunner, {
3042
+ getRecord: new GetRecordRequestStrategy(prefetcherOptions),
3043
+ getRecords: new GetRecordsRequestStrategy(prefetcherOptions),
3044
+ getRecordActions: new GetRecordActionsRequestStrategy(prefetcherOptions),
3045
+ getRecordAvatars: new GetRecordAvatarsRequestStrategy(prefetcherOptions),
3046
+ getObjectInfo: new GetObjectInfoRequestStrategy(prefetcherOptions),
3047
+ getObjectInfos: new GetObjectInfosRequestStrategy(prefetcherOptions),
3048
+ getRelatedListsActions: new GetRelatedListsActionsRequestStrategy(prefetcherOptions),
3049
+ getRelatedListRecords: new GetRelatedListRecordsRequestStrategy(prefetcherOptions),
3050
+ getRelatedListRecordsBatch: new GetRelatedListRecordsBatchRequestStrategy(prefetcherOptions),
3051
+ getRelatedListInfoBatch: new GetRelatedListInfoBatchRequestStrategy(prefetcherOptions),
3052
+ getListInfoByName: new GetListInfoByNameRequestStrategy(prefetcherOptions),
3053
+ getListRecordsByName: new GetListRecordsByNameRequestStrategy(prefetcherOptions),
3054
+ getApexStrategy: new GetApexRequestStrategy(prefetcherOptions),
3055
+ getComponentsDef: new GetComponentsDefStrategy(prefetcherOptions),
3056
+ getListInfosByObjectName: new GetListInfosByObjectNameRequestStrategy(prefetcherOptions),
3057
+ }, prefetcherOptions);
2987
3058
  registerPrefetcher(luvio, prefetcher);
2988
3059
  if (useApexPredictions.isOpen({ fallback: false })) {
2989
3060
  registerPrefetcher$1(luvio, prefetcher);
@@ -3150,4 +3221,4 @@ function ldsEngineCreator() {
3150
3221
  }
3151
3222
 
3152
3223
  export { buildPredictorForContext, ldsEngineCreator as default, initializeLDS, initializeOneStore };
3153
- // version: 1.299.0-83936bf1de
3224
+ // version: 1.301.0-ecd340c2e1
@@ -1,3 +1,3 @@
1
1
  /// <reference types="jest" />
2
- declare const executeGlobalControllerRawResponse: jest.Mock<any, any>;
2
+ declare const executeGlobalControllerRawResponse: jest.Mock<any, any, any>;
3
3
  export { executeGlobalControllerRawResponse };
@@ -1,3 +1,3 @@
1
1
  /// <reference types="jest" />
2
- declare const astResolver: jest.Mock<any, any>;
2
+ declare const astResolver: jest.Mock<any, any, any>;
3
3
  export { astResolver };
@@ -8,3 +8,10 @@ export type RequestEntry<Request> = {
8
8
  requestTime: number;
9
9
  };
10
10
  };
11
+ /**
12
+ * Request and Context data to be saved.
13
+ */
14
+ export type SaveRequestData<Request, Context> = {
15
+ request: Request;
16
+ context: Context;
17
+ };
@@ -6,7 +6,7 @@ export declare class LexDefaultPage extends PredictivePrefetchPage<LexRequest, D
6
6
  buildSaveRequestData(request: LexRequest): {
7
7
  context: DefaultPageContext;
8
8
  request: LexRequest;
9
- };
9
+ }[];
10
10
  resolveSimilarRequest(similarRequest: LexRequest): LexRequest;
11
11
  getAlwaysRunRequests(): LexRequest[];
12
12
  }
@@ -16,10 +16,7 @@ export declare class ObjectHomePage extends PredictivePrefetchPage<ObjectHomePag
16
16
  getListInfosByObjectName: GetListInfosByObjectNameRequestStrategy;
17
17
  getObjectInfos: GetObjectInfosRequestStrategy;
18
18
  });
19
- buildSaveRequestData(request: ObjectHomePageRequest): {
20
- request: any;
21
- context: any;
22
- };
19
+ buildSaveRequestData(request: ObjectHomePageRequest): import("..").SaveRequestData<any, any>[];
23
20
  resolveSimilarRequest(similarRequest: ObjectHomePageRequest): ObjectHomePageRequest;
24
21
  getAlwaysRunRequests(): ObjectHomePageRequest[];
25
22
  static handlesContext(context: LexContext): context is ObjectHomePageContext;
@@ -1,11 +1,9 @@
1
+ import type { SaveRequestData } from '../common';
1
2
  export declare abstract class PredictivePrefetchPage<Request, Context> {
2
3
  context: Context;
3
4
  similarContext: Partial<Context> | undefined;
4
5
  constructor(context: Context);
5
- abstract buildSaveRequestData(request: Request): {
6
- context: Context;
7
- request: Request;
8
- };
6
+ abstract buildSaveRequestData(request: Request): SaveRequestData<Request, Context>[];
9
7
  abstract resolveSimilarRequest(similarRequest: Request): Request;
10
8
  abstract getAlwaysRunRequests(): Request[];
11
9
  }
@@ -24,10 +24,7 @@ export declare class RecordHomePage extends PredictivePrefetchPage<RecordHomePag
24
24
  private requestStrategies;
25
25
  similarContext: RecordHomePageContext;
26
26
  constructor(context: RecordHomePageContext, requestStrategies: RecordHomePageRequestStrategies);
27
- buildSaveRequestData(request: RecordHomePageRequest): {
28
- request: any;
29
- context: any;
30
- };
27
+ buildSaveRequestData(request: RecordHomePageRequest): import("..").SaveRequestData<any, any>[];
31
28
  resolveSimilarRequest(similarRequest: RecordHomePageRequest): RecordHomePageRequest;
32
29
  getAlwaysRunRequests(): RecordHomePageRequest[];
33
30
  static handlesContext(context: LexContext): context is RecordHomePageContext;
@@ -1,6 +1,6 @@
1
+ import { ApplicationPredictivePrefetcher } from './predictive-prefetcher';
1
2
  import type { DefaultPageContext, PredictivePrefetchPage } from '../pages';
2
3
  import type { PrefetcherOptions } from './predictive-prefetcher';
3
- import { ApplicationPredictivePrefetcher } from './predictive-prefetcher';
4
4
  import type { GetRecordActionsRequestStrategy, GetRecordAvatarsRequestStrategy, GetRecordRequestStrategy, GetRecordsRequestStrategy, GetObjectInfoRequestStrategy, GetObjectInfosRequestStrategy, GetRelatedListsActionsRequestStrategy, GetRelatedListInfoBatchRequestStrategy, GetRelatedListRecordsRequestStrategy, GetRelatedListRecordsBatchRequestStrategy, GetListInfoByNameRequestStrategy, GetListRecordsByNameRequestStrategy, GetApexRequestStrategy, GetComponentsDefStrategy, GetListInfosByObjectNameRequestStrategy } from '../request-strategy';
5
5
  import type { RequestRunner } from '../request-runner';
6
6
  import type { PrefetchRepository } from '../repository/prefetch-repository';
@@ -2,11 +2,21 @@ import type { PrefetchRepository } from '../repository/prefetch-repository';
2
2
  import type { PredictivePrefetchPage } from '../pages';
3
3
  import type { RequestRunner } from '../request-runner';
4
4
  import type { RequestEntry } from '../common';
5
+ /**
6
+ * Options for the predictive prefetcher.
7
+ */
5
8
  export type PrefetcherOptions = {
9
+ /**
10
+ * Limit on the number of requests that can be inflight at any given time.
11
+ */
6
12
  inflightRequestLimit: number;
13
+ /**
14
+ * Whether to save requests in multiple context buckets or only in a single context. Defaults to false.
15
+ */
16
+ useSaveBuckets?: boolean;
7
17
  };
8
18
  export declare abstract class ApplicationPredictivePrefetcher<Request, Context extends Record<string, any>> {
9
- private repository;
19
+ protected repository: PrefetchRepository;
10
20
  protected requestRunner: RequestRunner<Request>;
11
21
  protected options: PrefetcherOptions;
12
22
  private _context;
@@ -19,7 +29,7 @@ export declare abstract class ApplicationPredictivePrefetcher<Request, Context e
19
29
  get context(): Context;
20
30
  stopRecording(): Promise<void>;
21
31
  startRecording(): void;
22
- saveRequest(request: Request): Promise<void>;
32
+ saveRequest(request: Request): void;
23
33
  predict(): Promise<void>;
24
34
  getPredictionSummary(): {
25
35
  exact: number;
@@ -0,0 +1,16 @@
1
+ import type { RequestRunner } from '../request-runner';
2
+ import type { RequestEntry } from '../common';
3
+ /**
4
+ * Runs a list of requests with a specified concurrency limit.
5
+ *
6
+ * @template Request - The type of the requests being processed.
7
+ * @param {RequestEntry<Request>[]} requests - An array of request entries to be processed in the array order.
8
+ * @param {RequestRunner<Request>} runner - The runner instance responsible for executing the requests.
9
+ * @param {number} concurrentRequestsLimit - The maximum number of concurrent requests allowed.
10
+ * @param {number} pageStartTime - The start time of the page load, used to calculate the time elapsed since the page starts loading.
11
+ * @returns {Promise<void>} A promise that resolves when all requests have been processed.
12
+ *
13
+ * This function manages a queue of pending requests and processes them with a concurrency limit.
14
+ * Requests are only processed if their `requestTime` is less than the time elapsed since `pageStartTime`.
15
+ */
16
+ export declare function runRequestsWithLimit<Request>(requests: RequestEntry<Request>[], runner: RequestRunner<Request>, concurrentRequestsLimit: number, pageStartTime: number): Promise<void>;
@@ -14,9 +14,11 @@ export declare class PrefetchRepository {
14
14
  private requestBuffer;
15
15
  constructor(storage: PrefetchStorage);
16
16
  clearRequestBuffer(): void;
17
+ pageStartTime: number;
18
+ markPageStart(): void;
17
19
  flushRequestsToStorage(): Promise<void>;
18
20
  getKeyId(key: Key): string;
19
- saveRequest<Request>(key: Key, request: Request): Promise<void>;
21
+ saveRequest<Request>(key: Key, request: Request): void;
20
22
  getPage<Request>(key: Key): PageEntry<Request> | undefined;
21
23
  getPageRequests<Request>(key: Key): RequestEntry<Request>[];
22
24
  }
@@ -11,8 +11,14 @@ export type GetApexRequest = {
11
11
  config: GetApexConfig;
12
12
  };
13
13
  export declare function getApexPdlFactory(luvio: Luvio): ({ invokerParams, config }: GetApexConfig) => import("@luvio/engine").Snapshot<any> | Promise<import("@luvio/engine").Snapshot<any>> | null;
14
- export declare class GetApexRequestStrategy extends LuvioAdapterRequestStrategy<GetApexConfig, GetApexRequest, any> {
14
+ type GetApexContext = Record<string, unknown>;
15
+ export declare class GetApexRequestStrategy extends LuvioAdapterRequestStrategy<GetApexConfig, GetApexRequest, GetApexContext> {
15
16
  adapterName: string;
16
17
  adapterFactory: typeof getApexPdlFactory;
17
18
  buildConcreteRequest(similarRequest: GetApexRequest): GetApexRequest;
19
+ buildSaveRequestData<C extends GetApexContext>(_similarContext: C, context: C, request: GetApexRequest): {
20
+ request: GetApexRequest;
21
+ context: C;
22
+ }[];
18
23
  }
24
+ export {};
@@ -13,7 +13,7 @@ export declare class GetComponentsDefStrategy extends ConfigBasedRequestStrategy
13
13
  buildSaveRequestData<C extends GetComponentsContext>(similarContext: C, _context: C, request: GetComponentsRequest): {
14
14
  request: GetComponentsRequest;
15
15
  context: C;
16
- };
16
+ }[];
17
17
  transformForSave(request: GetComponentsRequest): GetComponentsRequest;
18
18
  canCombine(): boolean;
19
19
  combineRequests(reqA: string[], reqB: string[]): string[];
@@ -17,7 +17,7 @@ export declare class GetListInfoByNameRequestStrategy extends LuvioAdapterReques
17
17
  buildSaveRequestData<C extends GetListInfoByNameContext>(_similarContext: C, context: C, request: GetListInfoByNameRequest): {
18
18
  request: GetListInfoByNameRequest;
19
19
  context: C;
20
- };
20
+ }[];
21
21
  canCombine(reqA: GetListInfoByNameConfig, reqB: GetListInfoByNameConfig): boolean;
22
22
  combineRequests(reqA: GetListInfoByNameConfig, _reqB: GetListInfoByNameConfig): GetListInfoByNameConfig;
23
23
  }
@@ -17,7 +17,7 @@ export declare class GetListInfosByObjectNameRequestStrategy extends LuvioAdapte
17
17
  buildSaveRequestData<C extends GetListInfosByObjectNameContext>(_similarContext: C, context: C, request: GetListInfosByObjectNameRequest): {
18
18
  request: GetListInfosByObjectNameRequest;
19
19
  context: C;
20
- };
20
+ }[];
21
21
  canCombine(reqA: GetListInfosByObjectNameConfig, reqB: GetListInfosByObjectNameConfig): boolean;
22
22
  combineRequests(reqA: GetListInfosByObjectNameConfig, _reqB: GetListInfosByObjectNameConfig): GetListInfosByObjectNameConfig;
23
23
  }
@@ -17,5 +17,5 @@ export declare class GetListRecordsByNameRequestStrategy extends LuvioAdapterReq
17
17
  buildSaveRequestData<C extends GetListRecordsByNameContext>(_similarContext: C, context: C, request: GetListRecordsByNameRequest): {
18
18
  request: GetListRecordsByNameRequest;
19
19
  context: C;
20
- };
20
+ }[];
21
21
  }
@@ -13,10 +13,6 @@ export declare class GetObjectInfoRequestStrategy extends LuvioAdapterRequestStr
13
13
  adapterName: string;
14
14
  adapterFactory: import("@luvio/engine").AdapterFactory<GetObjectInfoConfig, import("@salesforce/lds-adapters-uiapi").ObjectInfoRepresentation>;
15
15
  buildConcreteRequest(similarRequest: GetObjectInfoRequest, context: GetObjectInfoContext): GetObjectInfoRequest;
16
- buildSaveRequestData<C extends GetObjectInfoContext>(similarContext: C, context: C, request: GetObjectInfoRequest): {
17
- request: GetObjectInfoRequest;
18
- context: C;
19
- };
20
16
  transformForSave(request: GetObjectInfoRequest): GetObjectInfoRequest;
21
17
  isContextDependent(context: GetObjectInfoContext, request: GetObjectInfoRequest): boolean;
22
18
  /**
@@ -1,13 +1,27 @@
1
1
  import type { GetObjectInfosConfig } from '@salesforce/lds-adapters-uiapi';
2
+ import type { RequestEntry } from '../common';
3
+ import type { LuvioAdapterRequest } from './luvio-adapter-request';
2
4
  import { LuvioAdapterRequestStrategy } from './luvio-adapter-request-strategy';
5
+ import type { SaveRequestData } from '../common';
3
6
  export type GetObjectInfosRequest = {
4
7
  adapterName: 'getObjectInfos';
5
8
  config: GetObjectInfosConfig;
6
9
  };
7
10
  export declare const GET_OBJECT_INFO_BATCH_ADAPTER_NAME = "getObjectInfos";
8
- export declare class GetObjectInfosRequestStrategy extends LuvioAdapterRequestStrategy<GetObjectInfosConfig, GetObjectInfosRequest, any> {
11
+ type GetObjectInfosContext = Record<string, unknown>;
12
+ export declare class GetObjectInfosRequestStrategy extends LuvioAdapterRequestStrategy<GetObjectInfosConfig, GetObjectInfosRequest, GetObjectInfosContext> {
9
13
  adapterName: string;
10
14
  adapterFactory: import("@luvio/engine").AdapterFactory<GetObjectInfosConfig, import("@salesforce/lds-adapters-uiapi").SimplifiedBatchRepresentation>;
11
15
  buildConcreteRequest(similarRequest: GetObjectInfosRequest): GetObjectInfosRequest;
12
16
  transformForSave(request: GetObjectInfosRequest): GetObjectInfosRequest;
17
+ /**
18
+ * Reduces the given GetObjectInfosRequest requests by eliminating those for which config.objectApiNames
19
+ * is a subset of another GetObjectInfosRequest.
20
+ *
21
+ * @param unfilteredRequests - Array of unfiltered requests
22
+ * @returns RequestEntry<GetObjectInfosRequest>[] - Array of reduced requests
23
+ */
24
+ reduce(unfilteredRequests: RequestEntry<LuvioAdapterRequest<unknown>>[]): RequestEntry<GetObjectInfosRequest>[];
25
+ buildSaveRequestData(similarContext: GetObjectInfosContext, context: GetObjectInfosContext, request: GetObjectInfosRequest): SaveRequestData<GetObjectInfosRequest, GetObjectInfosContext>[];
13
26
  }
27
+ export {};
@@ -11,10 +11,7 @@ export declare class GetRecordActionsRequestStrategy extends LuvioAdapterRequest
11
11
  adapterName: string;
12
12
  adapterFactory: import("@luvio/engine").AdapterFactory<GetRecordActionsConfig, import("packages/lds-adapters-uiapi/dist/es/es2018/types/src/generated/types/ActionRepresentation").ActionRepresentation>;
13
13
  buildConcreteRequest(similarRequest: GetRecordActionsRequest, context: GetRecordActionsContext): GetRecordActionsRequest;
14
- buildSaveRequestData<C extends GetRecordActionsContext>(similarContext: C, context: C, request: GetRecordActionsRequest): {
15
- request: GetRecordActionsRequest;
16
- context: C;
17
- };
14
+ transformForSaveSimilarRequest(request: GetRecordActionsRequest): GetRecordActionsRequest;
18
15
  canCombine(reqA: GetRecordActionsConfig, reqB: GetRecordActionsConfig): boolean;
19
16
  combineRequests(reqA: GetRecordActionsConfig, reqB: GetRecordActionsConfig): GetRecordActionsConfig;
20
17
  isContextDependent(context: GetRecordActionsContext, request: GetRecordActionsRequest): boolean;
@@ -11,10 +11,7 @@ export declare class GetRecordAvatarsRequestStrategy extends LuvioAdapterRequest
11
11
  adapterName: string;
12
12
  adapterFactory: import("@luvio/engine").AdapterFactory<GetRecordAvatarsConfig, import("packages/lds-adapters-uiapi/dist/es/es2018/types/src/generated/types/RecordAvatarBulkMapRepresentation").RecordAvatarBulkMapRepresentation>;
13
13
  buildConcreteRequest(similarRequest: GetRecordAvatarsRequest, context: GetRecordAvatarsContext): GetRecordAvatarsRequest;
14
- buildSaveRequestData<C extends GetRecordAvatarsContext>(similarContext: C, context: C, request: GetRecordAvatarsRequest): {
15
- request: GetRecordAvatarsRequest;
16
- context: C;
17
- };
14
+ transformForSaveSimilarRequest(request: GetRecordAvatarsRequest): GetRecordAvatarsRequest;
18
15
  isContextDependent<C extends GetRecordAvatarsContext>(context: C, request: GetRecordAvatarsRequest): boolean;
19
16
  canCombine(reqA: GetRecordAvatarsConfig, reqB: GetRecordAvatarsConfig): boolean;
20
17
  combineRequests(reqA: GetRecordAvatarsConfig, reqB: GetRecordAvatarsConfig): GetRecordAvatarsConfig;
@@ -15,9 +15,6 @@ export declare class GetRecordRequestStrategy extends LuvioAdapterRequestStrateg
15
15
  canCombine(reqA: GetRecordConfig, reqB: GetRecordConfig): boolean;
16
16
  combineRequests(reqA: GetRecordConfig, reqB: GetRecordConfig): GetRecordConfig;
17
17
  isContextDependent(context: GetRecordContext, request: GetRecordRequest): boolean;
18
- buildSaveRequestData<C extends GetRecordContext>(similarContext: C, context: C, request: GetRecordRequest): {
19
- request: GetRecordRequest;
20
- context: C;
21
- };
18
+ transformForSaveSimilarRequest(request: GetRecordRequest): GetRecordRequest;
22
19
  }
23
20
  export {};
@@ -12,9 +12,6 @@ export declare class GetRecordsRequestStrategy extends LuvioAdapterRequestStrate
12
12
  adapterFactory: import("@luvio/engine").AdapterFactory<GetRecordsConfig, import("@salesforce/lds-adapters-uiapi").BatchRepresentation>;
13
13
  buildConcreteRequest(similarRequest: GetRecordsRequest, context: GetRecordsContext): GetRecordsRequest;
14
14
  isContextDependent(context: GetRecordsContext, request: GetRecordsRequest): boolean;
15
- buildSaveRequestData<Context extends GetRecordsContext, R extends GetRecordsRequest>(similarContext: Context, context: Context, request: R): {
16
- request: GetRecordsRequest;
17
- context: Context;
18
- };
15
+ transformForSaveSimilarRequest(request: GetRecordsRequest): GetRecordsRequest;
19
16
  }
20
17
  export {};
@@ -12,10 +12,7 @@ export declare class GetRelatedListRecordsBatchRequestStrategy extends LuvioAdap
12
12
  adapterName: string;
13
13
  adapterFactory: import("@luvio/engine").AdapterFactory<GetRelatedListRecordsBatchConfig, import("@salesforce/lds-adapters-uiapi").RelatedListRecordCollectionBatchRepresentation>;
14
14
  buildConcreteRequest(similarRequest: GetRelatedListRecordsBatchRequest, context: GetRelatedListRecordsBatchContext): GetRelatedListRecordsBatchRequest;
15
- buildSaveRequestData<C extends GetRelatedListRecordsBatchContext>(similarContext: C, context: C, request: GetRelatedListRecordsBatchRequest): {
16
- request: GetRelatedListRecordsBatchRequest;
17
- context: C;
18
- };
15
+ transformForSaveSimilarRequest(request: GetRelatedListRecordsBatchRequest): GetRelatedListRecordsBatchRequest;
19
16
  isContextDependent(context: GetRelatedListRecordsBatchContext, request: GetRelatedListRecordsBatchRequest): boolean;
20
17
  /**
21
18
  * Can combine two seperate batch requests if the parentRecordId is the same.
@@ -27,10 +27,7 @@ export declare class GetRelatedListRecordsRequestStrategy extends LuvioAdapterRe
27
27
  * @returns GetRelatedListRecordsRequest[] That should be a prediction.
28
28
  */
29
29
  reduce(unfilteredRequests: RequestEntry<LuvioAdapterRequest<unknown>>[]): RequestEntry<GetRelatedListRecordsRequest>[];
30
- buildSaveRequestData<C extends GetRelatedListRecordsContext>(similarContext: C, context: C, request: GetRelatedListRecordsRequest): {
31
- request: GetRelatedListRecordsRequest;
32
- context: C;
33
- };
30
+ transformForSaveSimilarRequest(request: GetRelatedListRecordsRequest): GetRelatedListRecordsRequest;
34
31
  isContextDependent(context: GetRelatedListRecordsContext, request: GetRelatedListRecordsRequest): boolean;
35
32
  }
36
33
  export {};
@@ -11,10 +11,7 @@ export declare class GetRelatedListsActionsRequestStrategy extends LuvioAdapterR
11
11
  adapterName: string;
12
12
  adapterFactory: import("@luvio/engine").AdapterFactory<GetRelatedListsActionsConfig, import("packages/lds-adapters-uiapi/dist/es/es2018/types/src/generated/types/ActionRelatedListsCollectionBatchRepresentation").ActionRelatedListsCollectionBatchRepresentation>;
13
13
  buildConcreteRequest(similarRequest: GetRelatedListsActionsRequest, context: GetRelatedListsActionsContext): GetRelatedListsActionsRequest;
14
- buildSaveRequestData<C extends GetRelatedListsActionsContext>(similarContext: C, context: C, request: GetRelatedListsActionsRequest): {
15
- request: GetRelatedListsActionsRequest;
16
- context: C;
17
- };
14
+ protected transformForSaveSimilarRequest(request: GetRelatedListsActionsRequest): GetRelatedListsActionsRequest;
18
15
  isContextDependent(context: GetRelatedListsActionsContext, request: GetRelatedListsActionsRequest): boolean;
19
16
  /**
20
17
  * Can only reduce two requests when they have the same recordId, and
@@ -2,7 +2,12 @@ import type { AdapterFactory } from '@luvio/engine';
2
2
  import { RequestStrategy } from './request-strategy';
3
3
  import type { LuvioAdapterRequest } from './luvio-adapter-request';
4
4
  import type { RequestEntry } from '../common';
5
+ import type { PrefetcherOptions } from '../prefetcher';
5
6
  export declare abstract class LuvioAdapterRequestStrategy<AdapterConfig, Request extends LuvioAdapterRequest<AdapterConfig>, Context> extends RequestStrategy<Request, Context> {
7
+ protected prefetcherOptions: Partial<PrefetcherOptions>;
8
+ constructor(options?: {
9
+ useSaveBuckets?: boolean;
10
+ });
6
11
  /**
7
12
  * Name of the adapter used in this strategy.
8
13
  */
@@ -66,11 +71,17 @@ export declare abstract class LuvioAdapterRequestStrategy<AdapterConfig, Request
66
71
  * - handling the cases where the request is context dependent (this is homework for the subclass)
67
72
  * @param _similarContext Context with at least one parameter as a wildcard '*'
68
73
  * @param context Exact context for a given page
69
- * @param request
70
- * @returns
74
+ * @param request Request to build save request data for
75
+ * @returns Save request data
71
76
  */
72
- buildSaveRequestData(_similarContext: Context, context: Context, request: Request): {
77
+ buildSaveRequestData(similarContext: Context, context: Context, request: Request): {
73
78
  request: Request;
74
79
  context: Context;
75
- };
80
+ }[];
81
+ /**
82
+ * Transforms the request for saving similar requests
83
+ * @param request Request to transform for saving similar requests
84
+ * @returns Transformed request
85
+ */
86
+ protected transformForSaveSimilarRequest(request: Request): Request;
76
87
  }
@@ -1,9 +1,6 @@
1
- import type { RequestEntry } from '../common';
1
+ import type { RequestEntry, SaveRequestData } from '../common';
2
2
  export declare abstract class RequestStrategy<Request, Context> {
3
- abstract buildSaveRequestData(similarContext: Context, context: Context, request: Request): {
4
- request: Request;
5
- context: Context;
6
- };
3
+ abstract buildSaveRequestData(similarContext: Context, context: Context, request: Request): SaveRequestData<Request, Context>[];
7
4
  abstract buildConcreteRequest(similarRequest: Request, context: Context): Request;
8
5
  transformForSave(request: Request): Request;
9
6
  reduce(requests: RequestEntry<Request>[]): RequestEntry<Request>[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/lds-runtime-aura",
3
- "version": "1.299.0",
3
+ "version": "1.301.0",
4
4
  "license": "SEE LICENSE IN LICENSE.txt",
5
5
  "description": "LDS engine for Aura runtime",
6
6
  "main": "dist/ldsEngineCreator.js",
@@ -44,24 +44,24 @@
44
44
  "@luvio/service-subscription": "^4.0.0",
45
45
  "@luvio/service-type-registry": "^4.0.0",
46
46
  "@luvio/utils": "^4.0.0",
47
- "@salesforce/lds-adapters-apex": "^1.299.0",
48
- "@salesforce/lds-adapters-uiapi": "^1.299.0",
49
- "@salesforce/lds-ads-bridge": "^1.299.0",
50
- "@salesforce/lds-aura-storage": "^1.299.0",
51
- "@salesforce/lds-bindings": "^1.299.0",
52
- "@salesforce/lds-instrumentation": "^1.299.0",
53
- "@salesforce/lds-network-aura": "^1.299.0",
54
- "@salesforce/lds-network-fetch-with-jwt": "^1.299.0"
47
+ "@salesforce/lds-adapters-apex": "^1.301.0",
48
+ "@salesforce/lds-adapters-uiapi": "^1.301.0",
49
+ "@salesforce/lds-ads-bridge": "^1.301.0",
50
+ "@salesforce/lds-aura-storage": "^1.301.0",
51
+ "@salesforce/lds-bindings": "^1.301.0",
52
+ "@salesforce/lds-instrumentation": "^1.301.0",
53
+ "@salesforce/lds-network-aura": "^1.301.0",
54
+ "@salesforce/lds-network-fetch-with-jwt": "^1.301.0"
55
55
  },
56
56
  "dependencies": {
57
- "@luvio/network-adapter-composable": "0.154.20",
58
- "@salesforce/lds-adapters-uiapi-lex": "^1.299.0"
57
+ "@luvio/network-adapter-composable": "0.155.1",
58
+ "@salesforce/lds-adapters-uiapi-lex": "^1.301.0"
59
59
  },
60
60
  "luvioBundlesize": [
61
61
  {
62
62
  "path": "./dist/ldsEngineCreator.js",
63
63
  "maxSize": {
64
- "none": "120 kB",
64
+ "none": "125 kB",
65
65
  "min": "52 kB",
66
66
  "compressed": "22 kB"
67
67
  }