@salesforce/lds-runtime-aura 1.271.0 → 1.272.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.
@@ -15,7 +15,7 @@
15
15
  import { HttpStatusCode, InMemoryStore, Environment, Luvio, InMemoryStoreQueryEvaluator } from 'force/luvioEngine';
16
16
  import ldsTrackedFieldsBehaviorGate from '@salesforce/gate/lds.useNewTrackedFieldBehavior';
17
17
  import usePredictiveLoading from '@salesforce/gate/lds.usePredictiveLoading';
18
- import { getRecordAvatarsAdapterFactory, getRecordAdapterFactory, getRecordsAdapterFactory, getRecordActionsAdapterFactory, getObjectInfoAdapterFactory, getObjectInfosAdapterFactory, instrument, configuration, InMemoryRecordRepresentationQueryEvaluator, UiApiNamespace, RecordRepresentationRepresentationType, registerPrefetcher } from 'force/ldsAdaptersUiapi';
18
+ import { getRecordAvatarsAdapterFactory, getRecordAdapterFactory, getRecordsAdapterFactory, getRecordActionsAdapterFactory, getObjectInfoAdapterFactory, getObjectInfosAdapterFactory, getRelatedListsActionsAdapterFactory, instrument, configuration, InMemoryRecordRepresentationQueryEvaluator, UiApiNamespace, RecordRepresentationRepresentationType, registerPrefetcher } from 'force/ldsAdaptersUiapi';
19
19
  import { createStorage, clearStorages } from 'force/ldsStorage';
20
20
  import { withRegistration, register, setDefaultLuvio } from 'force/ldsEngine';
21
21
  import { REFRESH_ADAPTER_EVENT, ADAPTER_UNFULFILLED_ERROR, instrument as instrument$2 } from 'force/ldsBindings';
@@ -70,6 +70,8 @@ class RecordHomePage extends PredictivePrefetchPage {
70
70
  return this.requestStrategies.getRecordAvatars.buildGetRecordAvatarsSaveRequestData(this.similarContext, this.context, request);
71
71
  case 'getObjectInfo':
72
72
  return this.requestStrategies.getObjectInfo.buildGetObjectInfoSaveRequestData(this.similarContext, this.context, request);
73
+ case 'getRelatedListsActions':
74
+ return this.requestStrategies.getRelatedListsActions.buildGetRelatedListsActionsSaveRequestData(this.similarContext, this.context, request);
73
75
  default:
74
76
  return { request, context: this.context };
75
77
  }
@@ -142,6 +144,9 @@ class RecordHomePage extends PredictivePrefetchPage {
142
144
  if (similarRequest.adapterName === 'getObjectInfos') {
143
145
  return this.requestStrategies.getObjectInfos.buildConcreteRequest(similarRequest);
144
146
  }
147
+ if (similarRequest.adapterName === 'getRelatedListsActions') {
148
+ return this.requestStrategies.getRelatedListsActions.buildConcreteRequest(similarRequest, this.context);
149
+ }
145
150
  return similarRequest;
146
151
  }
147
152
  // Record Home performs best when we always do a minimal getRecord alongside the other requests.
@@ -252,9 +257,9 @@ class LexPredictivePrefetcher extends ApplicationPredictivePrefetcher {
252
257
  }
253
258
 
254
259
  // Copy-pasted from adapter-utils. This util should be extracted from generated code and imported in prefetch repository.
255
- const { keys: ObjectKeys$1 } = Object;
260
+ const { keys: ObjectKeys$2 } = Object;
256
261
  const { stringify: JSONStringify } = JSON;
257
- const { isArray: ArrayIsArray } = Array;
262
+ const { isArray: ArrayIsArray$1 } = Array;
258
263
  /**
259
264
  * A deterministic JSON stringify implementation. Heavily adapted from https://github.com/epoberezkin/fast-json-stable-stringify.
260
265
  * This is needed because insertion order for JSON.stringify(object) affects output:
@@ -282,7 +287,7 @@ function stableJSONStringify$1(node) {
282
287
  }
283
288
  let i;
284
289
  let out;
285
- if (ArrayIsArray(node)) {
290
+ if (ArrayIsArray$1(node)) {
286
291
  out = '[';
287
292
  for (i = 0; i < node.length; i++) {
288
293
  if (i) {
@@ -295,7 +300,7 @@ function stableJSONStringify$1(node) {
295
300
  if (node === null) {
296
301
  return 'null';
297
302
  }
298
- const keys = ObjectKeys$1(node).sort();
303
+ const keys = ObjectKeys$2(node).sort();
299
304
  out = '';
300
305
  for (i = 0; i < keys.length; i++) {
301
306
  const key = keys[i];
@@ -322,8 +327,8 @@ function deepEquals(objA, objB) {
322
327
  if (!isObject(objA) || !isObject(objB))
323
328
  return false;
324
329
  // Filter out keys set as undefined, we can compare undefined as equals.
325
- const keysA = ObjectKeys$1(objA).filter((key) => objA[key] !== undefined);
326
- const keysB = ObjectKeys$1(objB).filter((key) => objB[key] !== undefined);
330
+ const keysA = ObjectKeys$2(objA).filter((key) => objA[key] !== undefined);
331
+ const keysB = ObjectKeys$2(objB).filter((key) => objB[key] !== undefined);
327
332
  // If the objects do not have the same set of keys, they are not deeply equal
328
333
  if (keysA.length !== keysB.length)
329
334
  return false;
@@ -350,8 +355,9 @@ class PrefetchRepository {
350
355
  this.requestBuffer.clear();
351
356
  }
352
357
  async flushRequestsToStorage() {
358
+ const setPromises = [];
353
359
  for (const [id, batch] of this.requestBuffer) {
354
- const rawPage = await this.storage.get(id);
360
+ const rawPage = this.storage.get(id);
355
361
  const page = rawPage === undefined ? { id, requests: [] } : rawPage;
356
362
  batch.forEach(({ request, requestTime }) => {
357
363
  let existingRequestEntry = page.requests.find(({ request: storedRequest }) => deepEquals(storedRequest, request));
@@ -361,12 +367,16 @@ class PrefetchRepository {
361
367
  }
362
368
  existingRequestEntry.requestMetadata.requestTimes.push(requestTime);
363
369
  });
364
- await this.storage.set(id, page);
370
+ setPromises.push(this.storage.set(id, page));
365
371
  }
366
372
  this.clearRequestBuffer();
373
+ await Promise.all(setPromises);
374
+ }
375
+ getKeyId(key) {
376
+ return stableJSONStringify$1(key);
367
377
  }
368
378
  async saveRequest(key, request) {
369
- const identifier = stableJSONStringify$1(key);
379
+ const identifier = this.getKeyId(key);
370
380
  const batchForKey = this.requestBuffer.get(identifier) || [];
371
381
  batchForKey.push({
372
382
  request,
@@ -513,7 +523,7 @@ class GetRecordRequestStrategy extends LuvioAdapterRequestStrategy {
513
523
  return request;
514
524
  }
515
525
  let optionalFields = request.config.optionalFields || [];
516
- if (!ArrayIsArray(optionalFields)) {
526
+ if (!ArrayIsArray$1(optionalFields)) {
517
527
  optionalFields = [optionalFields];
518
528
  }
519
529
  return {
@@ -678,6 +688,88 @@ class GetObjectInfosRequestStrategy extends LuvioAdapterRequestStrategy {
678
688
  }
679
689
  }
680
690
 
691
+ const { keys: ObjectKeys$1 } = Object;
692
+ const { isArray: ArrayIsArray, from: ArrayFrom } = Array;
693
+ function isReduceAbleRelatedListConfig(config) {
694
+ return config.relatedListsActionParameters.every((rlReq) => {
695
+ return rlReq.relatedListId !== undefined && ObjectKeys$1(rlReq).length === 1;
696
+ });
697
+ }
698
+ class GetRelatedListsActionsRequestStrategy extends LuvioAdapterRequestStrategy {
699
+ constructor() {
700
+ super(...arguments);
701
+ this.adapterName = 'getRelatedListsActions';
702
+ this.adapterFactory = getRelatedListsActionsAdapterFactory;
703
+ }
704
+ buildConcreteRequest(similarRequest, context) {
705
+ return {
706
+ ...similarRequest,
707
+ config: {
708
+ ...similarRequest.config,
709
+ recordIds: [context.recordId],
710
+ },
711
+ };
712
+ }
713
+ buildGetRelatedListsActionsSaveRequestData(similarContext, context, request) {
714
+ if (this.isGetRelatedListsActionsRequestContextDependent(context, request)) {
715
+ return {
716
+ request: this.transformForSave({
717
+ ...request,
718
+ config: {
719
+ ...request.config,
720
+ recordIds: ['*'],
721
+ },
722
+ }),
723
+ context: similarContext,
724
+ };
725
+ }
726
+ return {
727
+ request: this.transformForSave(request),
728
+ context,
729
+ };
730
+ }
731
+ isGetRelatedListsActionsRequestContextDependent(context, request) {
732
+ const isForContext = request.config.recordIds &&
733
+ (context.recordId === request.config.recordIds || // some may set this as string instead of array
734
+ (request.config.recordIds.length === 1 &&
735
+ request.config.recordIds[0] === context.recordId));
736
+ return isForContext && isReduceAbleRelatedListConfig(request.config);
737
+ }
738
+ /**
739
+ * Can only reduce two requests when they have the same recordId, and
740
+ * the individual relatedListAction config only have relatedListId.
741
+ *
742
+ * @param reqA
743
+ * @param reqB
744
+ * @returns boolean
745
+ */
746
+ canCombine(reqA, reqB) {
747
+ const [recordIdA, recordIdB] = [reqA.recordIds, reqB.recordIds].map((recordIds) => {
748
+ return ArrayIsArray(recordIds)
749
+ ? recordIds.length === 1
750
+ ? recordIds[0]
751
+ : null
752
+ : recordIds;
753
+ });
754
+ return (recordIdA === recordIdB &&
755
+ recordIdA !== null &&
756
+ isReduceAbleRelatedListConfig(reqA) &&
757
+ isReduceAbleRelatedListConfig(reqB));
758
+ }
759
+ combineRequests(reqA, reqB) {
760
+ const relatedListsIncluded = new Set();
761
+ [reqA, reqB].forEach(({ relatedListsActionParameters }) => {
762
+ relatedListsActionParameters.forEach(({ relatedListId }) => relatedListsIncluded.add(relatedListId));
763
+ });
764
+ return {
765
+ recordIds: reqA.recordIds,
766
+ relatedListsActionParameters: ArrayFrom(relatedListsIncluded).map((relatedListId) => ({
767
+ relatedListId,
768
+ })),
769
+ };
770
+ }
771
+ }
772
+
681
773
  class LexRequestRunner {
682
774
  constructor(luvio) {
683
775
  this.luvio = luvio;
@@ -688,6 +780,7 @@ class LexRequestRunner {
688
780
  getRecordAvatars: new GetRecordAvatarsRequestStrategy(),
689
781
  getObjectInfo: new GetObjectInfoRequestStrategy(),
690
782
  getObjectInfos: new GetObjectInfosRequestStrategy(),
783
+ getRelatedListsActions: new GetRelatedListsActionsRequestStrategy(),
691
784
  };
692
785
  }
693
786
  reduceRequests(requests) {
@@ -1512,6 +1605,7 @@ function setupPredictivePrefetcher(luvio) {
1512
1605
  getRecordAvatars: new GetRecordAvatarsRequestStrategy(),
1513
1606
  getObjectInfo: new GetObjectInfoRequestStrategy(),
1514
1607
  getObjectInfos: new GetObjectInfosRequestStrategy(),
1608
+ getRelatedListsActions: new GetRelatedListsActionsRequestStrategy(),
1515
1609
  });
1516
1610
  registerPrefetcher(luvio, prefetcher);
1517
1611
  __lexPrefetcher = prefetcher;
@@ -1615,4 +1709,4 @@ function ldsEngineCreator() {
1615
1709
  }
1616
1710
 
1617
1711
  export { buildPredictorForContext, ldsEngineCreator as default, initializeLDS, predictiveLoadPage };
1618
- // version: 1.271.0-b5964d6f9
1712
+ // version: 1.272.0-61ac36df4
@@ -1,5 +1,5 @@
1
1
  import type { LexContext } from '../prefetcher';
2
- import type { GetRecordRequest, GetRecordsRequest, GetRecordRequestStrategy, GetRecordsRequestStrategy, GetRecordActionsRequestStrategy, GetRecordActionsRequest, GetRecordAvatarsRequest, GetRecordAvatarsRequestStrategy, GetObjectInfoRequest, GetObjectInfosRequest, GetObjectInfoRequestStrategy, GetObjectInfosRequestStrategy } from '../request-strategy';
2
+ import type { GetRecordRequest, GetRecordsRequest, GetRecordRequestStrategy, GetRecordsRequestStrategy, GetRecordActionsRequestStrategy, GetRecordActionsRequest, GetRecordAvatarsRequest, GetRecordAvatarsRequestStrategy, GetObjectInfoRequest, GetObjectInfosRequest, GetObjectInfoRequestStrategy, GetObjectInfosRequestStrategy, GetRelatedListsActionsRequestStrategy, GetRelatedListsActionsRequest } from '../request-strategy';
3
3
  import { PredictivePrefetchPage } from './predictive-prefetch-page';
4
4
  export type RecordHomePageContext = {
5
5
  objectApiName: string;
@@ -7,7 +7,7 @@ export type RecordHomePageContext = {
7
7
  actionName: string;
8
8
  type: 'recordPage';
9
9
  };
10
- export type RecordHomePageRequest = GetRecordRequest | GetRecordsRequest | GetRecordActionsRequest | GetRecordAvatarsRequest | GetObjectInfoRequest | GetObjectInfosRequest;
10
+ export type RecordHomePageRequest = GetRecordRequest | GetRecordsRequest | GetRecordActionsRequest | GetRecordAvatarsRequest | GetObjectInfoRequest | GetObjectInfosRequest | GetRelatedListsActionsRequest;
11
11
  export declare class RecordHomePage extends PredictivePrefetchPage<RecordHomePageRequest, RecordHomePageContext> {
12
12
  private requestStrategies;
13
13
  similarContext: RecordHomePageContext;
@@ -18,6 +18,7 @@ export declare class RecordHomePage extends PredictivePrefetchPage<RecordHomePag
18
18
  getRecordAvatars: GetRecordAvatarsRequestStrategy;
19
19
  getObjectInfo: GetObjectInfoRequestStrategy;
20
20
  getObjectInfos: GetObjectInfosRequestStrategy;
21
+ getRelatedListsActions: GetRelatedListsActionsRequestStrategy;
21
22
  });
22
23
  buildSaveRequestData(request: RecordHomePageRequest): {
23
24
  request: GetRecordRequest;
@@ -34,6 +35,9 @@ export declare class RecordHomePage extends PredictivePrefetchPage<RecordHomePag
34
35
  } | {
35
36
  request: GetObjectInfoRequest;
36
37
  context: RecordHomePageContext;
38
+ } | {
39
+ request: GetRelatedListsActionsRequest;
40
+ context: RecordHomePageContext;
37
41
  } | {
38
42
  request: GetObjectInfosRequest;
39
43
  context: RecordHomePageContext;
@@ -1,6 +1,6 @@
1
1
  import type { DefaultPageContext, PredictivePrefetchPage } from '../pages';
2
2
  import { ApplicationPredictivePrefetcher } from './predictive-prefetcher';
3
- import type { GetRecordActionsRequestStrategy, GetRecordAvatarsRequestStrategy, GetRecordRequestStrategy, GetRecordsRequestStrategy, GetObjectInfoRequestStrategy, GetObjectInfosRequestStrategy } from '../request-strategy';
3
+ import type { GetRecordActionsRequestStrategy, GetRecordAvatarsRequestStrategy, GetRecordRequestStrategy, GetRecordsRequestStrategy, GetObjectInfoRequestStrategy, GetObjectInfosRequestStrategy, GetRelatedListsActionsRequestStrategy } from '../request-strategy';
4
4
  import type { RequestRunner } from '../request-runner';
5
5
  import type { PrefetchRepository } from '../repository/prefetch-repository';
6
6
  import type { RecordHomePageContext, RecordHomePageRequest } from '../pages/record-home-page';
@@ -15,6 +15,7 @@ export declare class LexPredictivePrefetcher extends ApplicationPredictivePrefet
15
15
  getRecordAvatars: GetRecordAvatarsRequestStrategy;
16
16
  getObjectInfo: GetObjectInfoRequestStrategy;
17
17
  getObjectInfos: GetObjectInfosRequestStrategy;
18
+ getRelatedListsActions: GetRelatedListsActionsRequestStrategy;
18
19
  });
19
20
  getPage(): PredictivePrefetchPage<LexRequest, LexContext>;
20
21
  }
@@ -20,6 +20,7 @@ export declare class PrefetchRepository {
20
20
  constructor(storage: PrefetchStorage);
21
21
  clearRequestBuffer(): void;
22
22
  flushRequestsToStorage(): Promise<void>;
23
+ getKeyId(key: Key): string;
23
24
  saveRequest<Request>(key: Key, request: Request): Promise<void>;
24
25
  getPage<Request>(key: Key): PageEntry<Request> | undefined;
25
26
  getPageRequests<Request>(key: Key): Request[];
@@ -0,0 +1,30 @@
1
+ import type { GetRelatedListsActionsConfig } from '@salesforce/lds-adapters-uiapi';
2
+ import { LuvioAdapterRequestStrategy } from './luvio-adapter-request-strategy';
3
+ export type GetRelatedListsActionsRequest = {
4
+ adapterName: 'getRelatedListsActions';
5
+ config: GetRelatedListsActionsConfig;
6
+ };
7
+ type GetRelatedListsActionsContext = {
8
+ recordId: string;
9
+ };
10
+ export declare class GetRelatedListsActionsRequestStrategy extends LuvioAdapterRequestStrategy<GetRelatedListsActionsConfig, GetRelatedListsActionsRequest, GetRelatedListsActionsContext> {
11
+ adapterName: string;
12
+ adapterFactory: import("@luvio/engine").AdapterFactory<GetRelatedListsActionsConfig, import("packages/lds-adapters-uiapi/dist/es/es2018/types/src/generated/types/ActionRelatedListsCollectionBatchRepresentation").ActionRelatedListsCollectionBatchRepresentation>;
13
+ buildConcreteRequest(similarRequest: GetRelatedListsActionsRequest, context: GetRelatedListsActionsContext): GetRelatedListsActionsRequest;
14
+ buildGetRelatedListsActionsSaveRequestData<C extends GetRelatedListsActionsContext>(similarContext: C, context: C, request: GetRelatedListsActionsRequest): {
15
+ request: GetRelatedListsActionsRequest;
16
+ context: C;
17
+ };
18
+ private isGetRelatedListsActionsRequestContextDependent;
19
+ /**
20
+ * Can only reduce two requests when they have the same recordId, and
21
+ * the individual relatedListAction config only have relatedListId.
22
+ *
23
+ * @param reqA
24
+ * @param reqB
25
+ * @returns boolean
26
+ */
27
+ canCombine(reqA: GetRelatedListsActionsConfig, reqB: GetRelatedListsActionsConfig): boolean;
28
+ combineRequests(reqA: GetRelatedListsActionsConfig, reqB: GetRelatedListsActionsConfig): GetRelatedListsActionsConfig;
29
+ }
30
+ export {};
@@ -4,6 +4,7 @@ export * from './get-records-request-strategy';
4
4
  export * from './get-record-actions-request-strategy';
5
5
  export * from './get-object-info-request-strategy';
6
6
  export * from './get-object-infos-request-strategy';
7
+ export * from './get-related-lists-actions-request-strategy';
7
8
  export * from './luvio-adapter-request-strategy';
8
9
  export * from './luvio-adapter-request';
9
10
  export * from './request-strategy';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/lds-runtime-aura",
3
- "version": "1.271.0",
3
+ "version": "1.272.0",
4
4
  "license": "SEE LICENSE IN LICENSE.txt",
5
5
  "description": "LDS engine for Aura runtime",
6
6
  "main": "dist/ldsEngineCreator.js",
@@ -34,23 +34,23 @@
34
34
  "release:corejar": "yarn build && ../core-build/scripts/core.js --name=lds-runtime-aura"
35
35
  },
36
36
  "devDependencies": {
37
- "@salesforce/lds-adapters-uiapi": "^1.271.0",
38
- "@salesforce/lds-ads-bridge": "^1.271.0",
39
- "@salesforce/lds-aura-storage": "^1.271.0",
40
- "@salesforce/lds-bindings": "^1.271.0",
41
- "@salesforce/lds-instrumentation": "^1.271.0",
42
- "@salesforce/lds-network-aura": "^1.271.0",
43
- "@salesforce/lds-network-fetch-with-jwt": "^1.271.0"
37
+ "@salesforce/lds-adapters-uiapi": "^1.272.0",
38
+ "@salesforce/lds-ads-bridge": "^1.272.0",
39
+ "@salesforce/lds-aura-storage": "^1.272.0",
40
+ "@salesforce/lds-bindings": "^1.272.0",
41
+ "@salesforce/lds-instrumentation": "^1.272.0",
42
+ "@salesforce/lds-network-aura": "^1.272.0",
43
+ "@salesforce/lds-network-fetch-with-jwt": "^1.272.0"
44
44
  },
45
45
  "dependencies": {
46
- "@luvio/network-adapter-composable": "0.154.6"
46
+ "@luvio/network-adapter-composable": "0.154.9"
47
47
  },
48
48
  "luvioBundlesize": [
49
49
  {
50
50
  "path": "./dist/ldsEngineCreator.js",
51
51
  "maxSize": {
52
- "none": "65 kB",
53
- "min": "28 kB",
52
+ "none": "70 kB",
53
+ "min": "30 kB",
54
54
  "compressed": "13 kB"
55
55
  }
56
56
  }