@salesforce/lds-worker-api 1.395.0 → 1.396.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.
@@ -1371,4 +1371,4 @@ if (process.env.NODE_ENV !== 'production') {
1371
1371
  }
1372
1372
 
1373
1373
  export { createPrimingSession, draftManager, draftQueue, evictCacheRecordsByIds, evictExpiredCacheEntries, executeAdapter, executeMutatingAdapter, getImperativeAdapterNames, importLuvioAdapterModule, importOneStoreAdapterModule, invokeAdapter, invokeAdapterWithDraftToMerge, invokeAdapterWithDraftToReplace, invokeAdapterWithMetadata, nimbusDraftQueue, setMetadataTTL, setUiApiRecordTTL, stopEviction, subscribeToAdapter };
1374
- // version: 1.395.0-2bc84082ba
1374
+ // version: 1.396.0-08650966f4
@@ -4274,7 +4274,7 @@ function withDefaultLuvio(callback) {
4274
4274
  }
4275
4275
  callbacks.push(callback);
4276
4276
  }
4277
- // version: 1.395.0-2bc84082ba
4277
+ // version: 1.396.0-08650966f4
4278
4278
 
4279
4279
  // TODO [TD-0081508]: once that TD is fulfilled we can probably change this file
4280
4280
  function instrumentAdapter$1(createFunction, _metadata) {
@@ -5318,7 +5318,7 @@ function createGraphQLWireAdapterConstructor(luvio, adapter, metadata, astResolv
5318
5318
  const { apiFamily, name } = metadata;
5319
5319
  return createGraphQLWireAdapterConstructor$1(adapter, `${apiFamily}.${name}`, luvio, astResolver);
5320
5320
  }
5321
- // version: 1.395.0-2bc84082ba
5321
+ // version: 1.396.0-08650966f4
5322
5322
 
5323
5323
  /**
5324
5324
  * Copyright (c) 2022, Salesforce, Inc.,
@@ -34154,7 +34154,7 @@ withDefaultLuvio((luvio) => {
34154
34154
  throttle(60, 60000, setupNotifyAllListRecordUpdateAvailable(luvio));
34155
34155
  throttle(60, 60000, setupNotifyAllListInfoSummaryUpdateAvailable(luvio));
34156
34156
  });
34157
- // version: 1.395.0-81b62e57cb
34157
+ // version: 1.396.0-216c6e4547
34158
34158
 
34159
34159
  function requestIdleDetectedCallback(_callback) { }
34160
34160
  function declareNotifierTaskSingle(_name) {
@@ -94328,6 +94328,14 @@ class CacheControlRequestRunner {
94328
94328
  }
94329
94329
  }
94330
94330
  class CacheControlCommand extends BaseCommand {
94331
+ /**
94332
+ * Creates a new CacheControlCommand instance
94333
+ *
94334
+ * @param services - Required services including cache controller and optional pub/sub service
94335
+ * @param services.cacheController - The cache controller service for managing cache operations
94336
+ * @param services.pubSub - Optional pub/sub service for cache invalidation notifications
94337
+ * @param services - Additional services specific to the implementation
94338
+ */
94331
94339
  constructor(services) {
94332
94340
  super();
94333
94341
  this.services = services;
@@ -94335,16 +94343,31 @@ class CacheControlCommand extends BaseCommand {
94335
94343
  this.keysUpdated = void 0;
94336
94344
  this._isInternalExecution = false;
94337
94345
  this.lastResult = void 0;
94338
- this.unsubscribeFromKeysImpl = () => void 0;
94346
+ this.unsubscribers = [];
94339
94347
  this.subscriptions = [];
94340
94348
  this.instantiationTime = Date.now() / 1e3;
94341
94349
  }
94342
94350
  get isInternalExecution() {
94343
94351
  return this._isInternalExecution;
94344
94352
  }
94353
+ /**
94354
+ * Executes the cache control command with optional overrides
94355
+ *
94356
+ * This method orchestrates the cache control flow by:
94357
+ * 1. Clearing any existing subscriptions
94358
+ * 2. Merging configuration overrides with the base strategy config
94359
+ * 3. Building a request runner for cache operations
94360
+ * 4. Executing the cache controller with the request runner
94361
+ * 5. Handling the result and setting up subscriptions if needed
94362
+ *
94363
+ * @param overrides - Optional execution overrides including timestamp and cache control config
94364
+ * @param overrides.now - Override the current timestamp for cache control calculations
94365
+ * @param overrides.cacheControlConfig - Override cache control strategy configuration
94366
+ * @returns A subscribable result containing either the cached/network data or an error
94367
+ */
94345
94368
  execute(overrides) {
94346
94369
  this.keysUpdated = void 0;
94347
- this.unsubscribeFromKeys();
94370
+ this.unsubscribe();
94348
94371
  const mergedCacheControlConfig = mergeCacheControlConfigs(
94349
94372
  this.cacheControlStrategyConfig,
94350
94373
  overrides
@@ -94366,6 +94389,17 @@ class CacheControlCommand extends BaseCommand {
94366
94389
  });
94367
94390
  });
94368
94391
  }
94392
+ /**
94393
+ * Handles the result from the cache controller and builds the appropriate subscribable result
94394
+ *
94395
+ * This method processes the cache controller execution result and determines the appropriate
94396
+ * response based on network errors, cache errors, and available data. It handles graceful
94397
+ * degradation scenarios where network data is available even when cache operations fail.
94398
+ *
94399
+ * @param result - The result from the cache controller execution
94400
+ * @param requestRunner - The request runner containing network data and errors
94401
+ * @returns A subscribable result with the appropriate data or error
94402
+ */
94369
94403
  handleCacheControllerResult(result, requestRunner) {
94370
94404
  const { networkError, networkData, returnData } = requestRunner;
94371
94405
  return this.publishUpdatedKeys().then(() => {
@@ -94401,11 +94435,21 @@ class CacheControlCommand extends BaseCommand {
94401
94435
  );
94402
94436
  }
94403
94437
  if (this.subscriptions.length > 0) {
94404
- this.subscribeToKeysUsed();
94438
+ this.subscribe();
94405
94439
  }
94406
94440
  return returnData;
94407
94441
  });
94408
94442
  }
94443
+ /**
94444
+ * Builds a request runner that orchestrates cache read, network request, and cache write operations
94445
+ *
94446
+ * The request runner encapsulates the three main operations:
94447
+ * 1. Reading from cache with subscription setup
94448
+ * 2. Requesting data from the network
94449
+ * 3. Writing network results to cache and recording keys
94450
+ *
94451
+ * @returns A configured request runner for the cache controller
94452
+ */
94409
94453
  buildRequestRunner() {
94410
94454
  return new CacheControlRequestRunner(
94411
94455
  (cache) => this.buildResultWithSubscribe(cache),
@@ -94413,6 +94457,15 @@ class CacheControlCommand extends BaseCommand {
94413
94457
  (cache, networkResult) => this.writeToCacheAndRecordKeys(cache, networkResult)
94414
94458
  );
94415
94459
  }
94460
+ /**
94461
+ * Publishes cache update events for keys that were modified during the operation
94462
+ *
94463
+ * This method notifies other parts of the system about cache changes by publishing
94464
+ * a 'cacheUpdate' event with the set of keys that were updated. This enables
94465
+ * cache invalidation and reactive updates across the application.
94466
+ *
94467
+ * @returns A promise that resolves when the update event is published (or immediately if no pub/sub service)
94468
+ */
94416
94469
  publishUpdatedKeys() {
94417
94470
  if (this.services.pubSub) {
94418
94471
  if (this.keysUpdated !== void 0 && this.keysUpdated.size > 0) {
@@ -94427,11 +94480,25 @@ class CacheControlCommand extends BaseCommand {
94427
94480
  get operationType() {
94428
94481
  return "query";
94429
94482
  }
94430
- subscribeToKeysUsed() {
94431
- this.unsubscribeFromKeys();
94483
+ /**
94484
+ * Subscribes to cache update and invalidation events for reactive updates
94485
+ *
94486
+ * This method sets up subscriptions to listen for changes that affect the data returned
94487
+ * by this Command.
94488
+ *
94489
+ * By default, it subscribes to two types of events on the PubSub service:
94490
+ * - 'cacheUpdate': Triggers a rebuild with the original instantiation time
94491
+ * - 'cacheInvalidation': Triggers a full refresh without time constraints
94492
+ *
94493
+ * This method can be extended by subclasses to add additional subscriptions.
94494
+ *
94495
+ * Note: ALL subscriptions should push an unsubscribe function to the unsubscribers array,
94496
+ * for the lifecycle to work correctly and avoid memory leaks.
94497
+ */
94498
+ subscribe() {
94499
+ this.unsubscribe();
94432
94500
  const { pubSub } = this.services;
94433
94501
  if (!pubSub) {
94434
- this.unsubscribeFromKeysImpl = () => void 0;
94435
94502
  return;
94436
94503
  }
94437
94504
  const rebuildUnsubscribe = pubSub.subscribe({
@@ -94446,21 +94513,58 @@ class CacheControlCommand extends BaseCommand {
94446
94513
  callback: () => this.rerun().then(() => void 0),
94447
94514
  keys: this.keysUsed
94448
94515
  });
94449
- this.unsubscribeFromKeysImpl = () => {
94450
- rebuildUnsubscribe();
94451
- refreshUnsubscribe();
94452
- };
94453
- return;
94516
+ this.unsubscribers.push(rebuildUnsubscribe, refreshUnsubscribe);
94454
94517
  }
94455
- unsubscribeFromKeys() {
94456
- this.unsubscribeFromKeysImpl();
94518
+ /**
94519
+ * Unsubscribes from all stored subscriptions
94520
+ *
94521
+ * This method calls all stored unsubscribe functions to clean up event listeners
94522
+ * and prevent memory leaks. It should be called when the command is no longer
94523
+ * needed and is also called before setting up new subscriptions.
94524
+ */
94525
+ unsubscribe() {
94526
+ while (this.unsubscribers.length > 0) {
94527
+ const unsubscriber = this.unsubscribers.pop();
94528
+ unsubscriber == null ? void 0 : unsubscriber();
94529
+ }
94457
94530
  }
94458
- // TODO: This should likely be abstract in v2. For v1, provide default comparison logic.
94531
+ /**
94532
+ * Compares two result values for equality to determine if a cache update should trigger a rerun
94533
+ *
94534
+ * This method is used to prevent unnecessary reruns when the cached data hasn't actually changed.
94535
+ * The default implementation uses deep equality comparison, but subclasses can override this
94536
+ * to provide more efficient or domain-specific comparison logic.
94537
+ *
94538
+ * @param result1 - The first result to compare
94539
+ * @param result2 - The second result to compare
94540
+ * @returns True if the results are equal, false otherwise
94541
+ *
94542
+ * @todo This should likely be abstract in v2. For v1, provide default comparison logic.
94543
+ */
94459
94544
  equals(result1, result2) {
94460
94545
  return deepEquals$1(result1, result2);
94461
94546
  }
94547
+ /**
94548
+ * Hook method called after a network request completes
94549
+ *
94550
+ * This method provides a point for subclasses to perform post-request operations
94551
+ * such as logging, metrics collection, or cleanup. The default implementation
94552
+ * is empty and can be overridden by subclasses as needed.
94553
+ *
94554
+ * @param _options - Request completion options
94555
+ * @param _options.statusCode - HTTP status code from the network response
94556
+ */
94462
94557
  async afterRequestHooks(_options) {
94463
94558
  }
94559
+ /**
94560
+ * Forces a refresh of the cached data by bypassing cache and fetching from network
94561
+ *
94562
+ * This method executes the command with a "no-cache" configuration, ensuring that
94563
+ * fresh data is fetched from the network regardless of cache state. It's useful
94564
+ * for scenarios where you need to ensure the most up-to-date data.
94565
+ *
94566
+ * @returns A refresh result indicating success or failure of the refresh operation
94567
+ */
94464
94568
  refresh() {
94465
94569
  return this.rerun({ cacheControlConfig: { type: "no-cache" } }).then((result) => {
94466
94570
  if (result.isErr()) {
@@ -94469,6 +94573,17 @@ class CacheControlCommand extends BaseCommand {
94469
94573
  return ok$3(void 0);
94470
94574
  });
94471
94575
  }
94576
+ /**
94577
+ * Writes network result to cache and records the keys that were updated
94578
+ *
94579
+ * This method wraps the cache write operation with key tracking functionality.
94580
+ * It uses a recordable cache wrapper to capture which keys are modified during
94581
+ * the write operation, then updates the internal tracking of used and updated keys.
94582
+ *
94583
+ * @param cache - The cache instance to write to
94584
+ * @param networkResult - The network result containing data to write to cache
94585
+ * @returns A result indicating success or failure of the write operation
94586
+ */
94472
94587
  writeToCacheAndRecordKeys(cache, networkResult) {
94473
94588
  const recordableCache = cache.record();
94474
94589
  return this.writeToCache(recordableCache, networkResult).then((result) => {
@@ -94477,6 +94592,16 @@ class CacheControlCommand extends BaseCommand {
94477
94592
  return ok$3(result);
94478
94593
  });
94479
94594
  }
94595
+ /**
94596
+ * Builds a subscribable result by reading from cache and setting up subscriptions
94597
+ *
94598
+ * This method reads data from the cache and wraps the result in a subscribable
94599
+ * structure that allows consumers to subscribe to updates. It also tracks which
94600
+ * cache keys were read for future invalidation purposes.
94601
+ *
94602
+ * @param cache - The readonly cache to read from
94603
+ * @returns A subscribable result containing the cached data or error
94604
+ */
94480
94605
  buildResultWithSubscribe(cache) {
94481
94606
  const recordableCache = cache.record();
94482
94607
  const result = this.readFromCache(recordableCache);
@@ -94504,23 +94629,35 @@ class CacheControlCommand extends BaseCommand {
94504
94629
  * the last known value. If a change is detected, the provided
94505
94630
  * callback is invoked.
94506
94631
  *
94507
- * @param keysRead - keys of interest that were read during readFromCache
94508
94632
  * @returns an unsubscribe function to stop watching for updates
94509
94633
  */
94510
94634
  buildSubscribe() {
94511
94635
  return (consumerCallback) => {
94512
94636
  if (this.subscriptions.length === 0 && this.operationType === "query") {
94513
- this.subscribeToKeysUsed();
94637
+ this.subscribe();
94514
94638
  }
94515
94639
  this.subscriptions.push(consumerCallback);
94516
94640
  return () => {
94517
94641
  this.subscriptions = this.subscriptions.filter((cb) => cb !== consumerCallback);
94518
94642
  if (this.subscriptions.length === 0) {
94519
- this.unsubscribeFromKeys();
94643
+ this.unsubscribe();
94520
94644
  }
94521
94645
  };
94522
94646
  };
94523
94647
  }
94648
+ /**
94649
+ * Re-runs the command execution with optional overrides and notifies subscribers of changes
94650
+ *
94651
+ * This method is called internally when cache updates occur that affect the command's data.
94652
+ * It executes the command with the provided overrides and compares the result with the
94653
+ * last known result. If the data has changed, it notifies all subscribers with the new data.
94654
+ *
94655
+ * The method handles deduplication to prevent unnecessary notifications when the data
94656
+ * hasn't actually changed, and properly manages the internal execution state.
94657
+ *
94658
+ * @param overrides - Optional execution overrides for the rerun
94659
+ * @returns A promise that resolves to the execution result
94660
+ */
94524
94661
  rerun(overrides) {
94525
94662
  this._isInternalExecution = true;
94526
94663
  return this.execute(overrides).then((result) => {
@@ -94537,6 +94674,15 @@ class CacheControlCommand extends BaseCommand {
94537
94674
  return result;
94538
94675
  });
94539
94676
  }
94677
+ /**
94678
+ * Invokes all registered consumer callbacks with the provided data
94679
+ *
94680
+ * This private method safely calls all registered subscriber callbacks with the
94681
+ * provided result data. It includes error handling to prevent callback failures
94682
+ * from affecting other callbacks or the overall system.
94683
+ *
94684
+ * @param data - The result data to send to all subscribers
94685
+ */
94540
94686
  invokeConsumerCallbacks(data) {
94541
94687
  this.subscriptions.forEach((cb) => {
94542
94688
  try {
@@ -96064,7 +96210,7 @@ function buildServiceDescriptor$5(luvio) {
96064
96210
  },
96065
96211
  };
96066
96212
  }
96067
- // version: 1.395.0-81b62e57cb
96213
+ // version: 1.396.0-216c6e4547
96068
96214
 
96069
96215
  /**
96070
96216
  * Copyright (c) 2022, Salesforce, Inc.,
@@ -96090,7 +96236,7 @@ function buildServiceDescriptor$4(notifyRecordUpdateAvailable, getNormalizedLuvi
96090
96236
  },
96091
96237
  };
96092
96238
  }
96093
- // version: 1.395.0-81b62e57cb
96239
+ // version: 1.396.0-216c6e4547
96094
96240
 
96095
96241
  /*!
96096
96242
  * Copyright (c) 2022, Salesforce, Inc.,
@@ -97181,7 +97327,7 @@ class AuraGraphQLNormalizedCacheControlCommand extends AuraNormalizedCacheContro
97181
97327
  return this.runOriginalRequest();
97182
97328
  }
97183
97329
  if (this.subscriptions.length > 0) {
97184
- this.subscribeToKeysUsed();
97330
+ this.subscribe();
97185
97331
  }
97186
97332
  return returnData;
97187
97333
  });
@@ -97299,7 +97445,7 @@ class HttpGraphQLNormalizedCacheControlCommand extends HttpNormalizedCacheContro
97299
97445
  return this.runOriginalRequest();
97300
97446
  }
97301
97447
  if (this.subscriptions.length > 0) {
97302
- this.subscribeToKeysUsed();
97448
+ this.subscribe();
97303
97449
  }
97304
97450
  return returnData;
97305
97451
  });
@@ -97318,7 +97464,7 @@ function buildServiceDescriptor$2() {
97318
97464
  * All rights reserved.
97319
97465
  * For full license text, see the LICENSE.txt file
97320
97466
  */
97321
- function buildServiceDescriptor$1(interceptors = { request: [], response: [] }) {
97467
+ function buildServiceDescriptor$1(interceptors = { request: [], response: [] }, retryService) {
97322
97468
  return {
97323
97469
  type: "fetch",
97324
97470
  version: "1.0",
@@ -97328,7 +97474,12 @@ function buildServiceDescriptor$1(interceptors = { request: [], response: [] })
97328
97474
  (previousPromise, interceptor) => previousPromise.then(interceptor),
97329
97475
  resolvedPromiseLike$3(args)
97330
97476
  );
97331
- return pending.then((args2) => fetch(...args2)).then((response) => {
97477
+ return pending.then((args2) => {
97478
+ if (retryService) {
97479
+ return retryService.applyRetry(() => fetch(...args2));
97480
+ }
97481
+ return fetch(...args2);
97482
+ }).then((response) => {
97332
97483
  return responseInterceptors.reduce(
97333
97484
  (previousPromise, interceptor) => previousPromise.then(interceptor),
97334
97485
  resolvedPromiseLike$3(response)
@@ -98309,7 +98460,7 @@ register$1({
98309
98460
  id: '@salesforce/lds-network-adapter',
98310
98461
  instrument: instrument$2,
98311
98462
  });
98312
- // version: 1.395.0-2bc84082ba
98463
+ // version: 1.396.0-08650966f4
98313
98464
 
98314
98465
  const { create: create$3, keys: keys$3 } = Object;
98315
98466
  const { stringify: stringify$1, parse } = JSON;
@@ -101303,7 +101454,7 @@ function handleEmit(res, callback) {
101303
101454
  }
101304
101455
  callback(consumerEmittedData);
101305
101456
  }
101306
- // version: 1.395.0-81b62e57cb
101457
+ // version: 1.396.0-216c6e4547
101307
101458
 
101308
101459
  class Analytics__AnalyticsBrowseRepository extends UnidentifiableGraphQLTypeRepository {
101309
101460
  constructor(services, typeRegistry) {
@@ -105915,20 +106066,11 @@ function buildCommandClass(baseClass) {
105915
106066
  this.latestLuvioRecordIdsToInvalidate = undefined;
105916
106067
  this.latestUsedRecordIdToWeakEtagMap = undefined;
105917
106068
  this.latestDeletedRecordIds = undefined;
105918
- if (this.unsubscribeFromLuvioSnapshot) {
105919
- this.unsubscribeFromLuvioSnapshot();
105920
- this.unsubscribeFromLuvioSnapshot = undefined;
105921
- }
105922
106069
  const result = super.execute(overrides);
105923
106070
  result.then((_) => {
105924
106071
  const promises = [];
105925
106072
  if (this.operationType === 'mutation') {
105926
- const allRecordIds = [
105927
- ...new Set([
105928
- ...(this.latestDeletedRecordIds ?? []),
105929
- ...Object.keys(this.latestUsedRecordIdToWeakEtagMap ?? {}),
105930
- ]),
105931
- ];
106073
+ const allRecordIds = [...new Set([...(this.latestDeletedRecordIds ?? [])])];
105932
106074
  if (allRecordIds.length > 0) {
105933
106075
  promises.push(this.invalidateRecordIds(allRecordIds));
105934
106076
  }
@@ -105967,22 +106109,20 @@ function buildCommandClass(baseClass) {
105967
106109
  .add(1);
105968
106110
  return super.runOriginalRequest();
105969
106111
  }
105970
- subscribeToKeysUsed() {
105971
- super.subscribeToKeysUsed();
106112
+ subscribe() {
106113
+ super.subscribe();
105972
106114
  // Subscribe to luvio cache changes using the stored snapshot
105973
106115
  if (this.latestLuvioSnapshot) {
105974
106116
  try {
105975
106117
  const luvioService = this.services.luvio;
105976
106118
  const luvioInstance = luvioService.luvio;
105977
- if (this.unsubscribeFromLuvioSnapshot) {
105978
- this.unsubscribeFromLuvioSnapshot();
105979
- }
105980
- this.unsubscribeFromLuvioSnapshot = luvioInstance.storeSubscribe(this.latestLuvioSnapshot, (_) => {
106119
+ const unsubscribeFromLuvioSnapshot = luvioInstance.storeSubscribe(this.latestLuvioSnapshot, (_) => {
105981
106120
  // If any records used change at the top level, refresh all the data
105982
106121
  if (this.usedRecordsChanged()) {
105983
106122
  this.refresh();
105984
106123
  }
105985
106124
  });
106125
+ this.unsubscribers.push(unsubscribeFromLuvioSnapshot);
105986
106126
  }
105987
106127
  catch (error) { }
105988
106128
  }
@@ -113000,7 +113140,7 @@ function registerCallback(cb) {
113000
113140
  cb(graphql_v1_import, graphql_imperative$1, graphql_imperative_legacy_v1_import, graphql_state_manager, useOneStoreGraphQL);
113001
113141
  }
113002
113142
  }
113003
- // version: 1.395.0-81b62e57cb
113143
+ // version: 1.396.0-216c6e4547
113004
113144
 
113005
113145
  function createFragmentMap(documentNode) {
113006
113146
  const fragments = {};
@@ -139714,7 +139854,7 @@ register$1({
139714
139854
  configuration: { ...configurationForGraphQLAdapters$1 },
139715
139855
  instrument: instrument$1,
139716
139856
  });
139717
- // version: 1.395.0-81b62e57cb
139857
+ // version: 1.396.0-216c6e4547
139718
139858
 
139719
139859
  // On core the unstable adapters are re-exported with different names,
139720
139860
  // we want to match them here.
@@ -139866,7 +140006,7 @@ withDefaultLuvio((luvio) => {
139866
140006
  unstable_graphQL_imperative = createImperativeAdapter(luvio, createInstrumentedAdapter(ldsAdapter, adapterMetadata), adapterMetadata);
139867
140007
  graphQLImperative = ldsAdapter;
139868
140008
  });
139869
- // version: 1.395.0-81b62e57cb
140009
+ // version: 1.396.0-216c6e4547
139870
140010
 
139871
140011
  var gqlApi = /*#__PURE__*/Object.freeze({
139872
140012
  __proto__: null,
@@ -140665,7 +140805,7 @@ const callbacks$1 = [];
140665
140805
  function register(r) {
140666
140806
  callbacks$1.forEach((callback) => callback(r));
140667
140807
  }
140668
- // version: 1.395.0-2bc84082ba
140808
+ // version: 1.396.0-08650966f4
140669
140809
 
140670
140810
  /**
140671
140811
  * Copyright (c) 2022, Salesforce, Inc.,
@@ -141981,4 +142121,4 @@ const { luvio } = getRuntime();
141981
142121
  setDefaultLuvio({ luvio });
141982
142122
 
141983
142123
  export { createPrimingSession, draftManager, draftQueue, evictCacheRecordsByIds, evictExpiredCacheEntries, executeAdapter, executeMutatingAdapter, getImperativeAdapterNames, importLuvioAdapterModule, importOneStoreAdapterModule, invokeAdapter, invokeAdapterWithDraftToMerge, invokeAdapterWithDraftToReplace, invokeAdapterWithMetadata, nimbusDraftQueue, registerReportObserver, setMetadataTTL, setUiApiRecordTTL, stopEviction, subscribeToAdapter };
141984
- // version: 1.395.0-2bc84082ba
142124
+ // version: 1.396.0-08650966f4
@@ -4280,7 +4280,7 @@
4280
4280
  }
4281
4281
  callbacks.push(callback);
4282
4282
  }
4283
- // version: 1.395.0-2bc84082ba
4283
+ // version: 1.396.0-08650966f4
4284
4284
 
4285
4285
  // TODO [TD-0081508]: once that TD is fulfilled we can probably change this file
4286
4286
  function instrumentAdapter$1(createFunction, _metadata) {
@@ -5324,7 +5324,7 @@
5324
5324
  const { apiFamily, name } = metadata;
5325
5325
  return createGraphQLWireAdapterConstructor$1(adapter, `${apiFamily}.${name}`, luvio, astResolver);
5326
5326
  }
5327
- // version: 1.395.0-2bc84082ba
5327
+ // version: 1.396.0-08650966f4
5328
5328
 
5329
5329
  /**
5330
5330
  * Copyright (c) 2022, Salesforce, Inc.,
@@ -34160,7 +34160,7 @@
34160
34160
  throttle(60, 60000, setupNotifyAllListRecordUpdateAvailable(luvio));
34161
34161
  throttle(60, 60000, setupNotifyAllListInfoSummaryUpdateAvailable(luvio));
34162
34162
  });
34163
- // version: 1.395.0-81b62e57cb
34163
+ // version: 1.396.0-216c6e4547
34164
34164
 
34165
34165
  function requestIdleDetectedCallback(_callback) { }
34166
34166
  function declareNotifierTaskSingle(_name) {
@@ -94334,6 +94334,14 @@
94334
94334
  }
94335
94335
  }
94336
94336
  class CacheControlCommand extends BaseCommand {
94337
+ /**
94338
+ * Creates a new CacheControlCommand instance
94339
+ *
94340
+ * @param services - Required services including cache controller and optional pub/sub service
94341
+ * @param services.cacheController - The cache controller service for managing cache operations
94342
+ * @param services.pubSub - Optional pub/sub service for cache invalidation notifications
94343
+ * @param services - Additional services specific to the implementation
94344
+ */
94337
94345
  constructor(services) {
94338
94346
  super();
94339
94347
  this.services = services;
@@ -94341,16 +94349,31 @@
94341
94349
  this.keysUpdated = void 0;
94342
94350
  this._isInternalExecution = false;
94343
94351
  this.lastResult = void 0;
94344
- this.unsubscribeFromKeysImpl = () => void 0;
94352
+ this.unsubscribers = [];
94345
94353
  this.subscriptions = [];
94346
94354
  this.instantiationTime = Date.now() / 1e3;
94347
94355
  }
94348
94356
  get isInternalExecution() {
94349
94357
  return this._isInternalExecution;
94350
94358
  }
94359
+ /**
94360
+ * Executes the cache control command with optional overrides
94361
+ *
94362
+ * This method orchestrates the cache control flow by:
94363
+ * 1. Clearing any existing subscriptions
94364
+ * 2. Merging configuration overrides with the base strategy config
94365
+ * 3. Building a request runner for cache operations
94366
+ * 4. Executing the cache controller with the request runner
94367
+ * 5. Handling the result and setting up subscriptions if needed
94368
+ *
94369
+ * @param overrides - Optional execution overrides including timestamp and cache control config
94370
+ * @param overrides.now - Override the current timestamp for cache control calculations
94371
+ * @param overrides.cacheControlConfig - Override cache control strategy configuration
94372
+ * @returns A subscribable result containing either the cached/network data or an error
94373
+ */
94351
94374
  execute(overrides) {
94352
94375
  this.keysUpdated = void 0;
94353
- this.unsubscribeFromKeys();
94376
+ this.unsubscribe();
94354
94377
  const mergedCacheControlConfig = mergeCacheControlConfigs(
94355
94378
  this.cacheControlStrategyConfig,
94356
94379
  overrides
@@ -94372,6 +94395,17 @@
94372
94395
  });
94373
94396
  });
94374
94397
  }
94398
+ /**
94399
+ * Handles the result from the cache controller and builds the appropriate subscribable result
94400
+ *
94401
+ * This method processes the cache controller execution result and determines the appropriate
94402
+ * response based on network errors, cache errors, and available data. It handles graceful
94403
+ * degradation scenarios where network data is available even when cache operations fail.
94404
+ *
94405
+ * @param result - The result from the cache controller execution
94406
+ * @param requestRunner - The request runner containing network data and errors
94407
+ * @returns A subscribable result with the appropriate data or error
94408
+ */
94375
94409
  handleCacheControllerResult(result, requestRunner) {
94376
94410
  const { networkError, networkData, returnData } = requestRunner;
94377
94411
  return this.publishUpdatedKeys().then(() => {
@@ -94407,11 +94441,21 @@
94407
94441
  );
94408
94442
  }
94409
94443
  if (this.subscriptions.length > 0) {
94410
- this.subscribeToKeysUsed();
94444
+ this.subscribe();
94411
94445
  }
94412
94446
  return returnData;
94413
94447
  });
94414
94448
  }
94449
+ /**
94450
+ * Builds a request runner that orchestrates cache read, network request, and cache write operations
94451
+ *
94452
+ * The request runner encapsulates the three main operations:
94453
+ * 1. Reading from cache with subscription setup
94454
+ * 2. Requesting data from the network
94455
+ * 3. Writing network results to cache and recording keys
94456
+ *
94457
+ * @returns A configured request runner for the cache controller
94458
+ */
94415
94459
  buildRequestRunner() {
94416
94460
  return new CacheControlRequestRunner(
94417
94461
  (cache) => this.buildResultWithSubscribe(cache),
@@ -94419,6 +94463,15 @@
94419
94463
  (cache, networkResult) => this.writeToCacheAndRecordKeys(cache, networkResult)
94420
94464
  );
94421
94465
  }
94466
+ /**
94467
+ * Publishes cache update events for keys that were modified during the operation
94468
+ *
94469
+ * This method notifies other parts of the system about cache changes by publishing
94470
+ * a 'cacheUpdate' event with the set of keys that were updated. This enables
94471
+ * cache invalidation and reactive updates across the application.
94472
+ *
94473
+ * @returns A promise that resolves when the update event is published (or immediately if no pub/sub service)
94474
+ */
94422
94475
  publishUpdatedKeys() {
94423
94476
  if (this.services.pubSub) {
94424
94477
  if (this.keysUpdated !== void 0 && this.keysUpdated.size > 0) {
@@ -94433,11 +94486,25 @@
94433
94486
  get operationType() {
94434
94487
  return "query";
94435
94488
  }
94436
- subscribeToKeysUsed() {
94437
- this.unsubscribeFromKeys();
94489
+ /**
94490
+ * Subscribes to cache update and invalidation events for reactive updates
94491
+ *
94492
+ * This method sets up subscriptions to listen for changes that affect the data returned
94493
+ * by this Command.
94494
+ *
94495
+ * By default, it subscribes to two types of events on the PubSub service:
94496
+ * - 'cacheUpdate': Triggers a rebuild with the original instantiation time
94497
+ * - 'cacheInvalidation': Triggers a full refresh without time constraints
94498
+ *
94499
+ * This method can be extended by subclasses to add additional subscriptions.
94500
+ *
94501
+ * Note: ALL subscriptions should push an unsubscribe function to the unsubscribers array,
94502
+ * for the lifecycle to work correctly and avoid memory leaks.
94503
+ */
94504
+ subscribe() {
94505
+ this.unsubscribe();
94438
94506
  const { pubSub } = this.services;
94439
94507
  if (!pubSub) {
94440
- this.unsubscribeFromKeysImpl = () => void 0;
94441
94508
  return;
94442
94509
  }
94443
94510
  const rebuildUnsubscribe = pubSub.subscribe({
@@ -94452,21 +94519,58 @@
94452
94519
  callback: () => this.rerun().then(() => void 0),
94453
94520
  keys: this.keysUsed
94454
94521
  });
94455
- this.unsubscribeFromKeysImpl = () => {
94456
- rebuildUnsubscribe();
94457
- refreshUnsubscribe();
94458
- };
94459
- return;
94522
+ this.unsubscribers.push(rebuildUnsubscribe, refreshUnsubscribe);
94460
94523
  }
94461
- unsubscribeFromKeys() {
94462
- this.unsubscribeFromKeysImpl();
94524
+ /**
94525
+ * Unsubscribes from all stored subscriptions
94526
+ *
94527
+ * This method calls all stored unsubscribe functions to clean up event listeners
94528
+ * and prevent memory leaks. It should be called when the command is no longer
94529
+ * needed and is also called before setting up new subscriptions.
94530
+ */
94531
+ unsubscribe() {
94532
+ while (this.unsubscribers.length > 0) {
94533
+ const unsubscriber = this.unsubscribers.pop();
94534
+ unsubscriber == null ? void 0 : unsubscriber();
94535
+ }
94463
94536
  }
94464
- // TODO: This should likely be abstract in v2. For v1, provide default comparison logic.
94537
+ /**
94538
+ * Compares two result values for equality to determine if a cache update should trigger a rerun
94539
+ *
94540
+ * This method is used to prevent unnecessary reruns when the cached data hasn't actually changed.
94541
+ * The default implementation uses deep equality comparison, but subclasses can override this
94542
+ * to provide more efficient or domain-specific comparison logic.
94543
+ *
94544
+ * @param result1 - The first result to compare
94545
+ * @param result2 - The second result to compare
94546
+ * @returns True if the results are equal, false otherwise
94547
+ *
94548
+ * @todo This should likely be abstract in v2. For v1, provide default comparison logic.
94549
+ */
94465
94550
  equals(result1, result2) {
94466
94551
  return deepEquals$1(result1, result2);
94467
94552
  }
94553
+ /**
94554
+ * Hook method called after a network request completes
94555
+ *
94556
+ * This method provides a point for subclasses to perform post-request operations
94557
+ * such as logging, metrics collection, or cleanup. The default implementation
94558
+ * is empty and can be overridden by subclasses as needed.
94559
+ *
94560
+ * @param _options - Request completion options
94561
+ * @param _options.statusCode - HTTP status code from the network response
94562
+ */
94468
94563
  async afterRequestHooks(_options) {
94469
94564
  }
94565
+ /**
94566
+ * Forces a refresh of the cached data by bypassing cache and fetching from network
94567
+ *
94568
+ * This method executes the command with a "no-cache" configuration, ensuring that
94569
+ * fresh data is fetched from the network regardless of cache state. It's useful
94570
+ * for scenarios where you need to ensure the most up-to-date data.
94571
+ *
94572
+ * @returns A refresh result indicating success or failure of the refresh operation
94573
+ */
94470
94574
  refresh() {
94471
94575
  return this.rerun({ cacheControlConfig: { type: "no-cache" } }).then((result) => {
94472
94576
  if (result.isErr()) {
@@ -94475,6 +94579,17 @@
94475
94579
  return ok$3(void 0);
94476
94580
  });
94477
94581
  }
94582
+ /**
94583
+ * Writes network result to cache and records the keys that were updated
94584
+ *
94585
+ * This method wraps the cache write operation with key tracking functionality.
94586
+ * It uses a recordable cache wrapper to capture which keys are modified during
94587
+ * the write operation, then updates the internal tracking of used and updated keys.
94588
+ *
94589
+ * @param cache - The cache instance to write to
94590
+ * @param networkResult - The network result containing data to write to cache
94591
+ * @returns A result indicating success or failure of the write operation
94592
+ */
94478
94593
  writeToCacheAndRecordKeys(cache, networkResult) {
94479
94594
  const recordableCache = cache.record();
94480
94595
  return this.writeToCache(recordableCache, networkResult).then((result) => {
@@ -94483,6 +94598,16 @@
94483
94598
  return ok$3(result);
94484
94599
  });
94485
94600
  }
94601
+ /**
94602
+ * Builds a subscribable result by reading from cache and setting up subscriptions
94603
+ *
94604
+ * This method reads data from the cache and wraps the result in a subscribable
94605
+ * structure that allows consumers to subscribe to updates. It also tracks which
94606
+ * cache keys were read for future invalidation purposes.
94607
+ *
94608
+ * @param cache - The readonly cache to read from
94609
+ * @returns A subscribable result containing the cached data or error
94610
+ */
94486
94611
  buildResultWithSubscribe(cache) {
94487
94612
  const recordableCache = cache.record();
94488
94613
  const result = this.readFromCache(recordableCache);
@@ -94510,23 +94635,35 @@
94510
94635
  * the last known value. If a change is detected, the provided
94511
94636
  * callback is invoked.
94512
94637
  *
94513
- * @param keysRead - keys of interest that were read during readFromCache
94514
94638
  * @returns an unsubscribe function to stop watching for updates
94515
94639
  */
94516
94640
  buildSubscribe() {
94517
94641
  return (consumerCallback) => {
94518
94642
  if (this.subscriptions.length === 0 && this.operationType === "query") {
94519
- this.subscribeToKeysUsed();
94643
+ this.subscribe();
94520
94644
  }
94521
94645
  this.subscriptions.push(consumerCallback);
94522
94646
  return () => {
94523
94647
  this.subscriptions = this.subscriptions.filter((cb) => cb !== consumerCallback);
94524
94648
  if (this.subscriptions.length === 0) {
94525
- this.unsubscribeFromKeys();
94649
+ this.unsubscribe();
94526
94650
  }
94527
94651
  };
94528
94652
  };
94529
94653
  }
94654
+ /**
94655
+ * Re-runs the command execution with optional overrides and notifies subscribers of changes
94656
+ *
94657
+ * This method is called internally when cache updates occur that affect the command's data.
94658
+ * It executes the command with the provided overrides and compares the result with the
94659
+ * last known result. If the data has changed, it notifies all subscribers with the new data.
94660
+ *
94661
+ * The method handles deduplication to prevent unnecessary notifications when the data
94662
+ * hasn't actually changed, and properly manages the internal execution state.
94663
+ *
94664
+ * @param overrides - Optional execution overrides for the rerun
94665
+ * @returns A promise that resolves to the execution result
94666
+ */
94530
94667
  rerun(overrides) {
94531
94668
  this._isInternalExecution = true;
94532
94669
  return this.execute(overrides).then((result) => {
@@ -94543,6 +94680,15 @@
94543
94680
  return result;
94544
94681
  });
94545
94682
  }
94683
+ /**
94684
+ * Invokes all registered consumer callbacks with the provided data
94685
+ *
94686
+ * This private method safely calls all registered subscriber callbacks with the
94687
+ * provided result data. It includes error handling to prevent callback failures
94688
+ * from affecting other callbacks or the overall system.
94689
+ *
94690
+ * @param data - The result data to send to all subscribers
94691
+ */
94546
94692
  invokeConsumerCallbacks(data) {
94547
94693
  this.subscriptions.forEach((cb) => {
94548
94694
  try {
@@ -96070,7 +96216,7 @@
96070
96216
  },
96071
96217
  };
96072
96218
  }
96073
- // version: 1.395.0-81b62e57cb
96219
+ // version: 1.396.0-216c6e4547
96074
96220
 
96075
96221
  /**
96076
96222
  * Copyright (c) 2022, Salesforce, Inc.,
@@ -96096,7 +96242,7 @@
96096
96242
  },
96097
96243
  };
96098
96244
  }
96099
- // version: 1.395.0-81b62e57cb
96245
+ // version: 1.396.0-216c6e4547
96100
96246
 
96101
96247
  /*!
96102
96248
  * Copyright (c) 2022, Salesforce, Inc.,
@@ -97187,7 +97333,7 @@
97187
97333
  return this.runOriginalRequest();
97188
97334
  }
97189
97335
  if (this.subscriptions.length > 0) {
97190
- this.subscribeToKeysUsed();
97336
+ this.subscribe();
97191
97337
  }
97192
97338
  return returnData;
97193
97339
  });
@@ -97305,7 +97451,7 @@
97305
97451
  return this.runOriginalRequest();
97306
97452
  }
97307
97453
  if (this.subscriptions.length > 0) {
97308
- this.subscribeToKeysUsed();
97454
+ this.subscribe();
97309
97455
  }
97310
97456
  return returnData;
97311
97457
  });
@@ -97324,7 +97470,7 @@
97324
97470
  * All rights reserved.
97325
97471
  * For full license text, see the LICENSE.txt file
97326
97472
  */
97327
- function buildServiceDescriptor$1(interceptors = { request: [], response: [] }) {
97473
+ function buildServiceDescriptor$1(interceptors = { request: [], response: [] }, retryService) {
97328
97474
  return {
97329
97475
  type: "fetch",
97330
97476
  version: "1.0",
@@ -97334,7 +97480,12 @@
97334
97480
  (previousPromise, interceptor) => previousPromise.then(interceptor),
97335
97481
  resolvedPromiseLike$3(args)
97336
97482
  );
97337
- return pending.then((args2) => fetch(...args2)).then((response) => {
97483
+ return pending.then((args2) => {
97484
+ if (retryService) {
97485
+ return retryService.applyRetry(() => fetch(...args2));
97486
+ }
97487
+ return fetch(...args2);
97488
+ }).then((response) => {
97338
97489
  return responseInterceptors.reduce(
97339
97490
  (previousPromise, interceptor) => previousPromise.then(interceptor),
97340
97491
  resolvedPromiseLike$3(response)
@@ -98315,7 +98466,7 @@
98315
98466
  id: '@salesforce/lds-network-adapter',
98316
98467
  instrument: instrument$2,
98317
98468
  });
98318
- // version: 1.395.0-2bc84082ba
98469
+ // version: 1.396.0-08650966f4
98319
98470
 
98320
98471
  const { create: create$3, keys: keys$3 } = Object;
98321
98472
  const { stringify: stringify$1, parse } = JSON;
@@ -101309,7 +101460,7 @@
101309
101460
  }
101310
101461
  callback(consumerEmittedData);
101311
101462
  }
101312
- // version: 1.395.0-81b62e57cb
101463
+ // version: 1.396.0-216c6e4547
101313
101464
 
101314
101465
  class Analytics__AnalyticsBrowseRepository extends UnidentifiableGraphQLTypeRepository {
101315
101466
  constructor(services, typeRegistry) {
@@ -105921,20 +106072,11 @@
105921
106072
  this.latestLuvioRecordIdsToInvalidate = undefined;
105922
106073
  this.latestUsedRecordIdToWeakEtagMap = undefined;
105923
106074
  this.latestDeletedRecordIds = undefined;
105924
- if (this.unsubscribeFromLuvioSnapshot) {
105925
- this.unsubscribeFromLuvioSnapshot();
105926
- this.unsubscribeFromLuvioSnapshot = undefined;
105927
- }
105928
106075
  const result = super.execute(overrides);
105929
106076
  result.then((_) => {
105930
106077
  const promises = [];
105931
106078
  if (this.operationType === 'mutation') {
105932
- const allRecordIds = [
105933
- ...new Set([
105934
- ...(this.latestDeletedRecordIds ?? []),
105935
- ...Object.keys(this.latestUsedRecordIdToWeakEtagMap ?? {}),
105936
- ]),
105937
- ];
106079
+ const allRecordIds = [...new Set([...(this.latestDeletedRecordIds ?? [])])];
105938
106080
  if (allRecordIds.length > 0) {
105939
106081
  promises.push(this.invalidateRecordIds(allRecordIds));
105940
106082
  }
@@ -105973,22 +106115,20 @@
105973
106115
  .add(1);
105974
106116
  return super.runOriginalRequest();
105975
106117
  }
105976
- subscribeToKeysUsed() {
105977
- super.subscribeToKeysUsed();
106118
+ subscribe() {
106119
+ super.subscribe();
105978
106120
  // Subscribe to luvio cache changes using the stored snapshot
105979
106121
  if (this.latestLuvioSnapshot) {
105980
106122
  try {
105981
106123
  const luvioService = this.services.luvio;
105982
106124
  const luvioInstance = luvioService.luvio;
105983
- if (this.unsubscribeFromLuvioSnapshot) {
105984
- this.unsubscribeFromLuvioSnapshot();
105985
- }
105986
- this.unsubscribeFromLuvioSnapshot = luvioInstance.storeSubscribe(this.latestLuvioSnapshot, (_) => {
106125
+ const unsubscribeFromLuvioSnapshot = luvioInstance.storeSubscribe(this.latestLuvioSnapshot, (_) => {
105987
106126
  // If any records used change at the top level, refresh all the data
105988
106127
  if (this.usedRecordsChanged()) {
105989
106128
  this.refresh();
105990
106129
  }
105991
106130
  });
106131
+ this.unsubscribers.push(unsubscribeFromLuvioSnapshot);
105992
106132
  }
105993
106133
  catch (error) { }
105994
106134
  }
@@ -113006,7 +113146,7 @@ keys: keys$2,
113006
113146
  cb(graphql_v1_import, graphql_imperative$1, graphql_imperative_legacy_v1_import, graphql_state_manager, useOneStoreGraphQL);
113007
113147
  }
113008
113148
  }
113009
- // version: 1.395.0-81b62e57cb
113149
+ // version: 1.396.0-216c6e4547
113010
113150
 
113011
113151
  function createFragmentMap(documentNode) {
113012
113152
  const fragments = {};
@@ -139720,7 +139860,7 @@ keys: keys$2,
139720
139860
  configuration: { ...configurationForGraphQLAdapters$1 },
139721
139861
  instrument: instrument$1,
139722
139862
  });
139723
- // version: 1.395.0-81b62e57cb
139863
+ // version: 1.396.0-216c6e4547
139724
139864
 
139725
139865
  // On core the unstable adapters are re-exported with different names,
139726
139866
  // we want to match them here.
@@ -139872,7 +140012,7 @@ keys: keys$2,
139872
140012
  unstable_graphQL_imperative = createImperativeAdapter(luvio, createInstrumentedAdapter(ldsAdapter, adapterMetadata), adapterMetadata);
139873
140013
  graphQLImperative = ldsAdapter;
139874
140014
  });
139875
- // version: 1.395.0-81b62e57cb
140015
+ // version: 1.396.0-216c6e4547
139876
140016
 
139877
140017
  var gqlApi = /*#__PURE__*/Object.freeze({
139878
140018
  __proto__: null,
@@ -140671,7 +140811,7 @@ keys: keys$2,
140671
140811
  function register(r) {
140672
140812
  callbacks$1.forEach((callback) => callback(r));
140673
140813
  }
140674
- // version: 1.395.0-2bc84082ba
140814
+ // version: 1.396.0-08650966f4
140675
140815
 
140676
140816
  /**
140677
140817
  * Copyright (c) 2022, Salesforce, Inc.,
@@ -142008,4 +142148,4 @@ keys: keys$2,
142008
142148
  exports.subscribeToAdapter = subscribeToAdapter;
142009
142149
 
142010
142150
  }));
142011
- // version: 1.395.0-2bc84082ba
142151
+ // version: 1.396.0-08650966f4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/lds-worker-api",
3
- "version": "1.395.0",
3
+ "version": "1.396.0",
4
4
  "license": "SEE LICENSE IN LICENSE.txt",
5
5
  "description": "",
6
6
  "main": "dist/standalone/es/lds-worker-api.js",
@@ -35,14 +35,14 @@
35
35
  },
36
36
  "devDependencies": {
37
37
  "@oat-sa/rollup-plugin-wildcard-external": "^1.0.0",
38
- "@salesforce/lds-adapters-graphql": "^1.395.0",
39
- "@salesforce/lds-adapters-uiapi": "^1.395.0",
40
- "@salesforce/lds-default-luvio": "^1.395.0",
41
- "@salesforce/lds-drafts": "^1.395.0",
42
- "@salesforce/lds-graphql-parser": "^1.395.0",
43
- "@salesforce/lds-luvio-engine": "^1.395.0",
44
- "@salesforce/lds-runtime-mobile": "^1.395.0",
45
- "@salesforce/nimbus-plugin-lds": "^1.395.0",
38
+ "@salesforce/lds-adapters-graphql": "^1.396.0",
39
+ "@salesforce/lds-adapters-uiapi": "^1.396.0",
40
+ "@salesforce/lds-default-luvio": "^1.396.0",
41
+ "@salesforce/lds-drafts": "^1.396.0",
42
+ "@salesforce/lds-graphql-parser": "^1.396.0",
43
+ "@salesforce/lds-luvio-engine": "^1.396.0",
44
+ "@salesforce/lds-runtime-mobile": "^1.396.0",
45
+ "@salesforce/nimbus-plugin-lds": "^1.396.0",
46
46
  "ajv": "^8.11.0",
47
47
  "glob": "^7.1.5",
48
48
  "nimbus-types": "^2.0.0-alpha1",