@salesforce/lds-worker-api 1.152.4 → 1.154.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.
@@ -770,4 +770,4 @@ if (process.env.NODE_ENV !== 'production') {
770
770
  }
771
771
 
772
772
  export { createPrimingSession, draftManager, draftQueue, executeAdapter, executeMutatingAdapter, getImperativeAdapterNames, invokeAdapter, invokeAdapterWithDraftToReplace, invokeAdapterWithMetadata, nimbusDraftQueue, setMetadataTTL, setUiApiRecordTTL, subscribeToAdapter };
773
- // version: 1.152.4-cef16daed
773
+ // version: 1.154.0-3a36aab7e
@@ -3799,7 +3799,7 @@ function withDefaultLuvio(callback) {
3799
3799
  }
3800
3800
  callbacks.push(callback);
3801
3801
  }
3802
- // version: 1.152.4-cef16daed
3802
+ // version: 1.154.0-3a36aab7e
3803
3803
 
3804
3804
  // TODO [TD-0081508]: once that TD is fulfilled we can probably change this file
3805
3805
  function instrumentAdapter$1(createFunction, _metadata) {
@@ -15232,7 +15232,7 @@ function parseAndVisit(source) {
15232
15232
  updateReferenceMapWithKnownKey(ast, luvioDocumentNode);
15233
15233
  return luvioDocumentNode;
15234
15234
  }
15235
- // version: 1.152.4-cef16daed
15235
+ // version: 1.154.0-3a36aab7e
15236
15236
 
15237
15237
  function unwrap(data) {
15238
15238
  // The lwc-luvio bindings import a function from lwc called "unwrap".
@@ -16145,7 +16145,7 @@ function createGraphQLWireAdapterConstructor(luvio, adapter, metadata, astResolv
16145
16145
  const { apiFamily, name } = metadata;
16146
16146
  return createGraphQLWireAdapterConstructor$1(adapter, `${apiFamily}.${name}`, luvio, astResolver);
16147
16147
  }
16148
- // version: 1.152.4-cef16daed
16148
+ // version: 1.154.0-3a36aab7e
16149
16149
 
16150
16150
  /**
16151
16151
  * Copyright (c) 2022, Salesforce, Inc.,
@@ -16232,7 +16232,7 @@ var FragmentReadResultState;
16232
16232
 
16233
16233
  const { keys: ObjectKeys$3, create: ObjectCreate$3 } = Object;
16234
16234
 
16235
- const { assign: assign$7, create: create$8, freeze: freeze$4, keys: keys$a } = Object;
16235
+ const { assign: assign$8, create: create$8, freeze: freeze$4, keys: keys$a } = Object;
16236
16236
 
16237
16237
  ObjectCreate$3(null);
16238
16238
 
@@ -17153,7 +17153,7 @@ function getTypeCacheKeys$Q$1(luvio, input, fullPathFactory) {
17153
17153
  return rootKeySet;
17154
17154
  }
17155
17155
 
17156
- const { assign: assign$6, create: create$7, freeze: freeze$3, keys: keys$9 } = Object;
17156
+ const { assign: assign$7, create: create$7, freeze: freeze$3, keys: keys$9 } = Object;
17157
17157
  const { hasOwnProperty: hasOwnProperty$1 } = Object.prototype;
17158
17158
  const { split, endsWith } = String.prototype;
17159
17159
  const { isArray: isArray$7 } = Array;
@@ -25011,7 +25011,7 @@ function publishDependencies(luvio, recordIds, depKeys) {
25011
25011
  const node = luvio.getNode(recordDepKey);
25012
25012
  if (isGraphNode(node)) {
25013
25013
  const recordDeps = node.retrieve();
25014
- assign$6(dependencies, recordDeps);
25014
+ assign$7(dependencies, recordDeps);
25015
25015
  }
25016
25016
  luvio.storePublish(recordDepKey, dependencies);
25017
25017
  }
@@ -25400,7 +25400,7 @@ function makeRecordLayoutMap(luvio, config, apiName, recordTypeId, layoutTypes,
25400
25400
  }
25401
25401
  const { layoutType, mode, snapshot } = container;
25402
25402
  if (wrapper.layoutMap[layoutType] === undefined) {
25403
- wrapper.layoutMap = assign$6({}, wrapper.layoutMap, {
25403
+ wrapper.layoutMap = assign$7({}, wrapper.layoutMap, {
25404
25404
  [layoutType]: {},
25405
25405
  });
25406
25406
  }
@@ -34186,7 +34186,7 @@ function typeCheckConfig$u(untrustedConfig) {
34186
34186
  }
34187
34187
  }
34188
34188
  if (records.length > 0) {
34189
- assign$6(config, { records });
34189
+ assign$7(config, { records });
34190
34190
  }
34191
34191
  }
34192
34192
  return config;
@@ -44016,7 +44016,7 @@ withDefaultLuvio((luvio) => {
44016
44016
  dropFunction: instrumentation$2.notifyRecordUpdateAvailableDropped,
44017
44017
  });
44018
44018
  });
44019
- // version: 1.152.4-044bf00f2
44019
+ // version: 1.154.0-492daee11
44020
44020
 
44021
44021
  var caseSensitiveUserId = '005B0000000GR4OIAW';
44022
44022
 
@@ -44603,7 +44603,7 @@ function isDeprecatedDurableStoreEntry(durableRecord) {
44603
44603
  const DefaultDurableSegment = 'DEFAULT';
44604
44604
  const RedirectDurableSegment = 'REDIRECT_KEYS';
44605
44605
 
44606
- const { keys: keys$6, create: create$5, assign: assign$4, freeze: freeze$1$1 } = Object;
44606
+ const { keys: keys$6, create: create$5, assign: assign$5, freeze: freeze$1$1 } = Object;
44607
44607
 
44608
44608
  //Durable store error instrumentation key
44609
44609
  const DURABLE_STORE_ERROR = 'durable-store-error';
@@ -48971,7 +48971,7 @@ function createDraftSynthesisErrorResponse(message = 'failed to synthesize draft
48971
48971
  return new DraftErrorFetchResponse(HttpStatusCode$1.BadRequest, error);
48972
48972
  }
48973
48973
 
48974
- const { keys: keys$4, create: create$4, assign: assign$3, values: values$2 } = Object;
48974
+ const { keys: keys$4, create: create$4, assign: assign$4, values: values$2 } = Object;
48975
48975
  const { stringify: stringify$4, parse: parse$4 } = JSON;
48976
48976
  const { isArray: isArray$3 } = Array;
48977
48977
 
@@ -50536,6 +50536,104 @@ function isEntryDurableRecordRepresentation(entry, key) {
50536
50536
  entry.data.__type === undefined);
50537
50537
  }
50538
50538
 
50539
+ function serializeFieldArguments$1(argumentNodes, variables) {
50540
+ const mutableArgumentNodes = Object.assign([], argumentNodes);
50541
+ return `args__(${mutableArgumentNodes
50542
+ .sort((a, b) => {
50543
+ const aName = a.name.value.toUpperCase();
50544
+ const bName = b.name.value.toUpperCase();
50545
+ return aName < bName ? -1 : aName > bName ? 1 : 0;
50546
+ })
50547
+ .map((node) => serializeArgNode$1(node, variables))
50548
+ .join('::')})`;
50549
+ }
50550
+ function serializeArgNode$1(argumentNode, variables) {
50551
+ const argName = argumentNode.name.value;
50552
+ return `${argName}:${serializeValueNode$2(argumentNode.value, variables)}`;
50553
+ }
50554
+ function serializeValueNode$2(valueNode, variables) {
50555
+ switch (valueNode.kind) {
50556
+ case 'BooleanValue':
50557
+ return valueNode.value + '';
50558
+ case 'IntValue':
50559
+ case 'FloatValue':
50560
+ case 'EnumValue':
50561
+ case 'StringValue':
50562
+ return valueNode.value;
50563
+ case 'ListValue': {
50564
+ const mutableValueNodeList = Object.assign([], valueNode.values);
50565
+ return mutableValueNodeList
50566
+ .sort((a, b) => {
50567
+ const aVal = serializeValueNode$2(a, variables).toUpperCase();
50568
+ const bVal = serializeValueNode$2(b, variables).toUpperCase();
50569
+ return aVal < bVal ? -1 : aVal > bVal ? 1 : 0;
50570
+ })
50571
+ .map((val, i) => `${serializeValueNode$2(val, variables)}[${i}]`)
50572
+ .join(',');
50573
+ }
50574
+ case 'Variable': {
50575
+ const variableValue = variables[valueNode.name.value];
50576
+ return typeof variableValue === 'string'
50577
+ ? variableValue
50578
+ : JSON.stringify(variableValue);
50579
+ }
50580
+ case 'NullValue':
50581
+ return 'null';
50582
+ case 'ObjectValue': {
50583
+ const mutableFieldNodeList = Object.assign([], valueNode.fields);
50584
+ return mutableFieldNodeList
50585
+ .sort((a, b) => {
50586
+ const aName = a.name.value.toUpperCase();
50587
+ const bName = b.name.value.toUpperCase();
50588
+ return aName < bName ? -1 : aName > bName ? 1 : 0;
50589
+ })
50590
+ .map((field) => field.name.value + ':' + serializeValueNode$2(field.value, variables))
50591
+ .join(',');
50592
+ }
50593
+ }
50594
+ }
50595
+
50596
+ function serializeOperationNode$2(operationNode, variables, fragmentMap) {
50597
+ return `${serializeSelectionSet$1(operationNode.selectionSet, variables, fragmentMap)}`;
50598
+ }
50599
+ function serializeSelectionSet$1(selectionSetNode, variables, fragmentMap) {
50600
+ return `${selectionSetNode.selections
50601
+ .map((selection) => serializeSelectionNode$1(selection, variables, fragmentMap))
50602
+ .join()}`;
50603
+ }
50604
+ /**
50605
+ *
50606
+ * @description This function takes a GraphQL SelectionNode from an AST and serializes it in a stable way, so we can
50607
+ * use it for property names and Store keys.
50608
+ * @param selectionNode
50609
+ * @param variables
50610
+ * @param fragmentMap
50611
+ * @returns string
50612
+ */
50613
+ function serializeSelectionNode$1(selectionNode, variables, fragmentMap) {
50614
+ switch (selectionNode.kind) {
50615
+ case 'Field': {
50616
+ const hasArguments = selectionNode.arguments !== undefined && selectionNode.arguments.length > 0;
50617
+ const argumentSuffix = hasArguments
50618
+ ? `__${serializeFieldArguments$1(selectionNode.arguments, variables)}`
50619
+ : '';
50620
+ return `${selectionNode.name.value}${argumentSuffix}`;
50621
+ }
50622
+ case 'FragmentSpread': {
50623
+ const fragment = fragmentMap[selectionNode.name.value];
50624
+ return fragment === undefined
50625
+ ? selectionNode.name.value
50626
+ : serializeSelectionSet$1(fragment.selectionSet, variables, fragmentMap);
50627
+ }
50628
+ case 'InlineFragment':
50629
+ return serializeSelectionSet$1(selectionNode.selectionSet, variables, fragmentMap);
50630
+ }
50631
+ }
50632
+ function buildQueryTypeStringKey$1(args) {
50633
+ const { keyPrefix, schemaName, queryTypeName, operationNode, variables, fragmentMap } = args;
50634
+ return `${keyPrefix}::${schemaName}::${queryTypeName}[${serializeOperationNode$2(operationNode, variables, fragmentMap)}]`;
50635
+ }
50636
+
50539
50637
  /**
50540
50638
  * Copyright (c) 2022, Salesforce, Inc.,
50541
50639
  * All rights reserved.
@@ -50669,7 +50767,7 @@ function isArrayLike(x) {
50669
50767
  (x.length === 0 || (x.length > 0 && Object.prototype.hasOwnProperty.call(x, x.length - 1))));
50670
50768
  }
50671
50769
 
50672
- const { create: create$3, keys: keys$3, values: values$1, entries: entries$2 } = Object;
50770
+ const { create: create$3, keys: keys$3, values: values$1, entries: entries$2, assign: assign$3 } = Object;
50673
50771
  const { stringify: stringify$3, parse: parse$3 } = JSON;
50674
50772
  const { isArray: isArray$2 } = Array;
50675
50773
 
@@ -51113,6 +51211,10 @@ function dateRangesFrom(dateRange, input, dateFunction) {
51113
51211
  }
51114
51212
  }
51115
51213
 
51214
+ const JSON_EXTRACT_PATH_INGESTION_TIMESTAMP = '$.ingestionTimestamp';
51215
+ const JSON_EXTRACT_PATH_INGESTION_APINAME = '$.apiName';
51216
+ const JSON_EXTRACT_PATH_DRAFTS = '$.drafts';
51217
+
51116
51218
  const MultiPickListValueSeparator = ';';
51117
51219
  function filterToPredicates(where, recordType, alias, objectInfoMap, joins, draftFunctions) {
51118
51220
  if (!where)
@@ -51174,7 +51276,7 @@ function filterToPredicates(where, recordType, alias, objectInfoMap, joins, draf
51174
51276
  return [
51175
51277
  {
51176
51278
  alias: childAlias,
51177
- leftPath: '$.apiName',
51279
+ leftPath: JSON_EXTRACT_PATH_INGESTION_APINAME,
51178
51280
  operator: '=',
51179
51281
  value: entityName,
51180
51282
  dataType: 'String',
@@ -51635,11 +51737,18 @@ function buildQuery(config) {
51635
51737
  const joins = buildJoins(config);
51636
51738
  const predicates = buildPredicates(config);
51637
51739
  const orderBy = buildOrderBy(config);
51740
+ const staleRecordsSql = excludeStaleRecordsGate.isOpen({ fallback: false })
51741
+ ? `AND (
51742
+ json_extract("${config.alias}".metadata, '${JSON_EXTRACT_PATH_INGESTION_TIMESTAMP}') >= ?
51743
+ OR json_extract("${config.alias}".data, '${JSON_EXTRACT_PATH_DRAFTS}') IS NOT NULL
51744
+ )`
51745
+ : '';
51638
51746
  const sql = `
51639
51747
  SELECT "${config.alias}".data
51640
51748
  FROM lds_data "${config.alias}" ${joins.sql}
51641
51749
  WHERE "${config.alias}".key like 'UiApi::RecordRepresentation:%'
51642
- AND json_extract("${config.alias}".data, '$.apiName') = ?
51750
+ AND json_extract("${config.alias}".data, '${JSON_EXTRACT_PATH_INGESTION_APINAME}') = ?
51751
+ ${staleRecordsSql}
51643
51752
  ${predicates.sql}
51644
51753
  ${orderBy.sql}
51645
51754
  LIMIT ?
@@ -51652,6 +51761,7 @@ function buildQuery(config) {
51652
51761
  ...joins.bindings,
51653
51762
  // the api name for the main record type
51654
51763
  config.alias,
51764
+ ...(excludeStaleRecordsGate.isOpen({ fallback: false }) ? [config.ingestionTimestamp] : []),
51655
51765
  // where clause and parent scope bindings
51656
51766
  ...predicates.bindings,
51657
51767
  // limit binding
@@ -51677,19 +51787,33 @@ function buildJoins(config) {
51677
51787
  if (allJoins.length === 0)
51678
51788
  return { sql, bindings };
51679
51789
  sql = allJoins.reduce((joinAccumulator, join) => {
51790
+ let timestampAdded = false;
51680
51791
  const joinConditions = join.conditions.reduce((conditionAccumulator, condition) => {
51681
51792
  let joined_sql;
51793
+ const joinMetadataTimestamp = excludeStaleRecordsGate.isOpen({ fallback: false })
51794
+ ? ` AND (json_extract("${join.alias}".metadata, '${JSON_EXTRACT_PATH_INGESTION_TIMESTAMP}') >= ? OR json_extract("${join.alias}".data, '${JSON_EXTRACT_PATH_DRAFTS}') IS NOT NULL)`
51795
+ : '';
51682
51796
  // predicate on a value, use the newly joined table
51683
51797
  if ('type' in condition) {
51684
51798
  const { sql, binding } = predicateToSQL(condition, join.alias);
51685
- joined_sql = ` AND ${sql}`;
51799
+ joined_sql = ` AND ${sql}${timestampAdded ? '' : joinMetadataTimestamp}`;
51686
51800
  bindings.push(...binding);
51801
+ if (excludeStaleRecordsGate.isOpen({ fallback: false }) &&
51802
+ timestampAdded === false) {
51803
+ bindings.push(config.ingestionTimestamp);
51804
+ timestampAdded = true;
51805
+ }
51687
51806
  }
51688
51807
  else {
51689
51808
  // predicate on a path
51690
51809
  const left = ` AND json_extract("${join.to}".data, '${condition.leftPath}')`;
51691
51810
  const right = `json_extract("${join.alias}".data, '${condition.rightPath}')`;
51692
- joined_sql = `${left} = ${right}`;
51811
+ joined_sql = `${left} = ${right}${timestampAdded ? '' : joinMetadataTimestamp}`;
51812
+ if (excludeStaleRecordsGate.isOpen({ fallback: false }) &&
51813
+ timestampAdded === false) {
51814
+ bindings.push(config.ingestionTimestamp);
51815
+ timestampAdded = true;
51816
+ }
51693
51817
  }
51694
51818
  conditionAccumulator += joined_sql;
51695
51819
  return conditionAccumulator;
@@ -52368,7 +52492,7 @@ function orderByToPredicate(orderBy, recordType, alias, objectInfoMap, joins) {
52368
52492
  function pathForKey(key) {
52369
52493
  switch (key) {
52370
52494
  case 'ApiName':
52371
- return '$.apiName';
52495
+ return JSON_EXTRACT_PATH_INGESTION_APINAME;
52372
52496
  case 'WeakEtag':
52373
52497
  return '$.weakEtag';
52374
52498
  case 'Id':
@@ -52390,7 +52514,7 @@ function scopeToJoins(scope = '', settings) {
52390
52514
  {
52391
52515
  type: PredicateType.single,
52392
52516
  alias: 'ServiceAppointment_AssignedResource',
52393
- leftPath: '$.apiName',
52517
+ leftPath: JSON_EXTRACT_PATH_INGESTION_APINAME,
52394
52518
  operator: '=',
52395
52519
  value: 'AssignedResource',
52396
52520
  dataType: 'String',
@@ -52411,7 +52535,7 @@ function scopeToJoins(scope = '', settings) {
52411
52535
  {
52412
52536
  type: PredicateType.single,
52413
52537
  alias: 'ServiceAppointment_AssignedResource_ServiceResource',
52414
- leftPath: '$.apiName',
52538
+ leftPath: JSON_EXTRACT_PATH_INGESTION_APINAME,
52415
52539
  operator: '=',
52416
52540
  value: 'ServiceResource',
52417
52541
  dataType: 'String',
@@ -52516,14 +52640,21 @@ function addResolversToSchema(schema, polyFields) {
52516
52640
  // Fields of the `RecordQuery` type are the record queries for the entity types
52517
52641
  // supported for the org
52518
52642
  for (const recordQuery of fields) {
52519
- recordQuery.resolve = function recordConnectionResolver(record, args) {
52643
+ recordQuery.resolve = async function recordConnectionResolver(record, args, { query }, info) {
52644
+ const { name: currentFieldName } = recordQuery;
52645
+ let ingestionTimestamp = 0;
52646
+ if (excludeStaleRecordsGate.isOpen({ fallback: false })) {
52647
+ // at our record query we fetch each ingestion time stamp and pass it down to each lower resolver to query against
52648
+ ingestionTimestamp = await fetchIngestionTimeStampFromDatabase(currentFieldName, info, args, query);
52649
+ }
52520
52650
  // In the SF schema, the relevant arguments are passed into RecordQuery fields, but actually used
52521
52651
  // down in the edge resolvers. For this resolver, we can just return what was passed in
52522
52652
  // to make it available to the next execution step
52523
52653
  return {
52524
52654
  parentArgs: args,
52525
52655
  parentRecord: record,
52526
- currentFieldName: recordQuery.name,
52656
+ currentFieldName,
52657
+ ingestionTimestamp,
52527
52658
  };
52528
52659
  };
52529
52660
  }
@@ -52569,10 +52700,11 @@ function addResolversToSchema(schema, polyFields) {
52569
52700
  // }
52570
52701
  for (const field of fields) {
52571
52702
  if (field.name === 'node') {
52572
- field.resolve = function nodeResolver(record, _args, { seenRecordIds }) {
52703
+ field.resolve = function nodeResolver(obj, _args, { seenRecordIds }) {
52704
+ const { record, ingestionTimestamp } = obj;
52573
52705
  const recordRepresentation = parse$3(record);
52574
52706
  seenRecordIds.add(recordRepresentation.id);
52575
- return recordRepresentation;
52707
+ return { recordRepresentation, ingestionTimestamp };
52576
52708
  };
52577
52709
  }
52578
52710
  }
@@ -52595,40 +52727,40 @@ function addResolversToSchema(schema, polyFields) {
52595
52727
  for (const field of fields) {
52596
52728
  switch (field.name) {
52597
52729
  case 'Id':
52598
- field.resolve = (record) => record.id;
52730
+ field.resolve = ({ recordRepresentation: record }) => record.id;
52599
52731
  break;
52600
52732
  case 'ApiName':
52601
- field.resolve = (record) => record.apiName;
52733
+ field.resolve = ({ recordRepresentation: record }) => record.apiName;
52602
52734
  break;
52603
52735
  case 'WeakEtag':
52604
- field.resolve = (record) => record.weakEtag;
52736
+ field.resolve = ({ recordRepresentation: record }) => record.weakEtag;
52605
52737
  break;
52606
52738
  case '_drafts':
52607
- field.resolve = (record) => {
52739
+ field.resolve = ({ recordRepresentation: record, }) => {
52608
52740
  return record.drafts ? record.drafts : null;
52609
52741
  };
52610
52742
  break;
52611
52743
  case 'LastModifiedById':
52612
- field.resolve = (record) => {
52744
+ field.resolve = ({ recordRepresentation: record }) => {
52613
52745
  return record.lastModifiedById
52614
52746
  ? { value: record.lastModifiedById }
52615
52747
  : null;
52616
52748
  };
52617
52749
  break;
52618
52750
  case 'LastModifiedDate':
52619
- field.resolve = (record) => {
52751
+ field.resolve = ({ recordRepresentation: record }) => {
52620
52752
  return record.lastModifiedDate
52621
52753
  ? { value: record.lastModifiedDate }
52622
52754
  : null;
52623
52755
  };
52624
52756
  break;
52625
52757
  case 'SystemModstamp':
52626
- field.resolve = (record) => {
52758
+ field.resolve = ({ recordRepresentation: record }) => {
52627
52759
  return record.systemModstamp ? { value: record.systemModstamp } : null;
52628
52760
  };
52629
52761
  break;
52630
52762
  case 'RecordTypeId':
52631
- field.resolve = (record) => {
52763
+ field.resolve = ({ recordRepresentation: record }) => {
52632
52764
  return record.recordTypeId ? { value: record.recordTypeId } : null;
52633
52765
  };
52634
52766
  break;
@@ -52640,7 +52772,17 @@ function addResolversToSchema(schema, polyFields) {
52640
52772
  .getInterfaces()
52641
52773
  .find((iface) => iface.name === 'Record')) ||
52642
52774
  (recordFieldType && recordFieldType.name === 'Record')) {
52643
- field.resolve = function relationResolver(record, _args, { Record, seenRecordIds }) {
52775
+ field.resolve = async function relationResolver(obj, _args, { Record, seenRecordIds }) {
52776
+ const fetchRecordOrNull = async (key) => {
52777
+ const recordRepresentation = await Record.load(key);
52778
+ return recordRepresentation !== null
52779
+ ? {
52780
+ recordRepresentation,
52781
+ ingestionTimestamp,
52782
+ }
52783
+ : null;
52784
+ };
52785
+ const { recordRepresentation: record, ingestionTimestamp } = obj;
52644
52786
  const fieldName = field.name.endsWith('__r')
52645
52787
  ? field.name.replace('__r', '__c')
52646
52788
  : field.name;
@@ -52650,26 +52792,28 @@ function addResolversToSchema(schema, polyFields) {
52650
52792
  if (!id)
52651
52793
  return null;
52652
52794
  if (id['__ref'] !== undefined) {
52653
- return Record.load(record.fields[`${field.name}Id`].value);
52795
+ return fetchRecordOrNull(record.fields[`${field.name}Id`].value);
52654
52796
  }
52655
52797
  seenRecordIds.add(id);
52656
- return Record.load(id);
52798
+ return fetchRecordOrNull(id);
52657
52799
  };
52658
52800
  }
52659
52801
  else if (isObjectType(recordFieldType) &&
52660
52802
  field.type.name.endsWith('Connection')) {
52661
52803
  // spanning field to a connection
52662
- field.resolve = (record, args, { seenRecordIds }) => {
52663
- seenRecordIds.add(record.id);
52804
+ field.resolve = async ({ recordRepresentation, ingestionTimestamp }, args, { seenRecordIds }) => {
52805
+ seenRecordIds.add(recordRepresentation.id);
52806
+ const { name: currentFieldName } = field;
52664
52807
  return {
52665
52808
  parentArgs: args,
52666
- parentRecord: record,
52667
- currentFieldName: field.name,
52809
+ parentRecord: recordRepresentation,
52810
+ currentFieldName,
52811
+ ingestionTimestamp,
52668
52812
  };
52669
52813
  };
52670
52814
  }
52671
52815
  else {
52672
- field.resolve = function recordFieldResolver(record) {
52816
+ field.resolve = function recordFieldResolver({ recordRepresentation: record, }) {
52673
52817
  return record.fields[field.name] || null;
52674
52818
  };
52675
52819
  }
@@ -52681,7 +52825,7 @@ function addResolversToSchema(schema, polyFields) {
52681
52825
  if (recordInterface !== undefined && baseRecord !== undefined) {
52682
52826
  // Applys 'resolveType' of GraphQLInterfaceType to 'Record' interface. Since all the heterogenous types are named as 'apiName', the type with same name as the loaded record 'apiName' property is the type wanted.
52683
52827
  // GraphQL executor would match InLineFragment' condition with type and keeps the deeper level field resolving going.
52684
- recordInterface.resolveType = function (value) {
52828
+ recordInterface.resolveType = function ({ recordRepresentation: value, }) {
52685
52829
  const targetType = polyTypes.find((type) => type.name === value.apiName);
52686
52830
  return targetType === undefined ? baseRecord : targetType;
52687
52831
  };
@@ -52689,7 +52833,7 @@ function addResolversToSchema(schema, polyFields) {
52689
52833
  return schema;
52690
52834
  }
52691
52835
  async function connectionEdgeResolver(obj, _args, context) {
52692
- const { parentArgs = {}, parentRecord, currentFieldName } = obj;
52836
+ const { parentArgs = {}, parentRecord, currentFieldName, ingestionTimestamp } = obj;
52693
52837
  const { query, objectInfos, draftFunctions } = context;
52694
52838
  let joins = [];
52695
52839
  let alias = currentFieldName;
@@ -52720,10 +52864,19 @@ async function connectionEdgeResolver(obj, _args, context) {
52720
52864
  predicates,
52721
52865
  orderBy: orderByToPredicate(parentArgs.orderBy, alias, alias, context.objectInfos),
52722
52866
  limit: parentArgs.first,
52867
+ ingestionTimestamp,
52723
52868
  };
52724
52869
  const { sql, bindings } = buildQuery(queryConfig);
52725
52870
  const results = await query(sql, bindings);
52726
- return results.rows.map((row) => row[0]);
52871
+ //map each sql result with the ingestion timestamp to pass it down a level
52872
+ return results.rows
52873
+ .map((row) => row[0])
52874
+ .map((record) => {
52875
+ return {
52876
+ record,
52877
+ ingestionTimestamp,
52878
+ };
52879
+ });
52727
52880
  }
52728
52881
  /**
52729
52882
  * Converts a childRelationship into a predicate
@@ -52749,6 +52902,62 @@ function isRecordType(type) {
52749
52902
  const interfaces = type.getInterfaces();
52750
52903
  return Boolean(interfaces.find((iface) => iface.name === 'Record'));
52751
52904
  }
52905
+ /**
52906
+ * Builds the top level record query key based on AST data
52907
+ * @param operation
52908
+ * @param variables
52909
+ * @param argumentNodes
52910
+ * @param currentFieldName
52911
+ * @returns
52912
+ */
52913
+ function buildKeyStringForRecordQuery(operation, variables, argumentNodes, currentFieldName) {
52914
+ const queryKey = buildQueryTypeStringKey$1({
52915
+ luvio: {},
52916
+ keyPrefix: 'UiApi',
52917
+ schemaName: 'uiapi',
52918
+ queryTypeName: 'Query',
52919
+ operationNode: operation,
52920
+ variables,
52921
+ fragmentMap: {},
52922
+ });
52923
+ const filteredArgumentNodes = assign$3([], argumentNodes).filter((node) => node.name.value !== 'first' && node.name.value !== 'after');
52924
+ const argumentString = filteredArgumentNodes.length > 0
52925
+ ? '__' + serializeFieldArguments$1(filteredArgumentNodes, variables)
52926
+ : '';
52927
+ return `${queryKey}__uiapi__query__${currentFieldName}${argumentString}`;
52928
+ }
52929
+ /**
52930
+ * fetches a query level ingestion time stamp from the L2 cache
52931
+ * if no query has been seen then the timestamp is 0
52932
+ * @param apiName
52933
+ * @param info
52934
+ * @param args
52935
+ * @param query
52936
+ * @returns
52937
+ */
52938
+ async function fetchIngestionTimeStampFromDatabase(apiName, info, args, query) {
52939
+ const { operation, variableValues } = info;
52940
+ // if we cannot find the query key in the database then default to 0 as we assume we have not seen the query
52941
+ // and all the data is not stale
52942
+ let ingestionTimestamp = 0;
52943
+ if (info.fieldNodes.length > 0 && info.fieldNodes[0].arguments !== undefined) {
52944
+ const key = buildKeyStringForRecordQuery(operation,
52945
+ // join varables passed from query to the argument variables given from the AST
52946
+ { ...variableValues, ...args }, info.fieldNodes[0].arguments, apiName);
52947
+ const sql = `
52948
+ SELECT json_extract(metadata, '${JSON_EXTRACT_PATH_INGESTION_TIMESTAMP}')
52949
+ FROM lds_data
52950
+ WHERE key IS ?
52951
+ `;
52952
+ const results = await query(sql, [key]);
52953
+ const [timestamp] = results.rows.map((row) => row[0]);
52954
+ if (timestamp !== null && typeof timestamp === 'number') {
52955
+ //go back 10 ms to adjust for margin of error when top level query is stored and when raml objects are stored
52956
+ ingestionTimestamp = timestamp - 10;
52957
+ }
52958
+ }
52959
+ return ingestionTimestamp;
52960
+ }
52752
52961
 
52753
52962
  var uiapiSchemaString = "scalar String\nscalar DateTime\nscalar Currency\nscalar ID\nscalar Boolean\nscalar Longitude\nscalar Float\nscalar MultiPicklist\nscalar Base64\nscalar Url\nscalar PhoneNumber\nscalar Email\nscalar TextArea\nscalar Latitude\nscalar Picklist\nscalar RichTextArea\nscalar EncryptedString\nscalar Double\nscalar Long\nscalar JSON\nscalar Time\nscalar Int\nscalar Percent\nscalar LongTextArea\nscalar Date\ntype PercentAggregate implements FieldValue {\n value: Percent\n displayValue: String\n avg: DoubleValue\n count: LongValue\n countDistinct: LongValue\n format: String\n max: PercentValue\n min: PercentValue\n sum: PercentValue\n}\n\ntype StringAggregate implements FieldValue {\n value: String\n displayValue: String\n count: LongValue\n countDistinct: LongValue\n grouping: IntValue\n label: String\n max: StringValue\n min: StringValue\n}\n\ntype Query {\n uiapi: UIAPI!\n rateLimit: RateLimit\n}\n\ninput EmailOperators {\n eq: Email\n ne: Email\n like: Email\n lt: Email\n gt: Email\n lte: Email\n gte: Email\n in: [Email]\n nin: [Email]\n}\n\ninput PolymorphicParentRelationshipRecordOrderBy @generic {\n RecordOrderBy: RecordOrderBy @fieldCategory\n}\n\ninput DoubleOperators {\n eq: Double\n ne: Double\n lt: Double\n gt: Double\n lte: Double\n gte: Double\n in: [Double]\n nin: [Double]\n}\n\ntype DateOnlyAggregation {\n value: Date\n format: String\n}\n\ntype DateAggregate implements FieldValue {\n value: Date\n displayValue: String\n calendarMonth: DateFunctionAggregation\n calendarQuarter: DateFunctionAggregation\n calendarYear: DateFunctionAggregation\n count: LongValue\n countDistinct: LongValue\n dayInMonth: DateFunctionAggregation\n dayInWeek: DateFunctionAggregation\n dayInYear: DateFunctionAggregation\n fiscalMonth: DateFunctionAggregation\n fiscalQuarter: DateFunctionAggregation\n fiscalYear: DateFunctionAggregation\n format: String\n grouping: IntValue\n max: DateValue\n min: DateValue\n weekInMonth: DateFunctionAggregation\n weekInYear: DateFunctionAggregation\n}\n\ninput PolymorphicParentRelationshipGroupBy @generic {\n RecordGroupBy: RecordGroupBy @fieldCategory\n}\n\nenum GroupByFunction {\n DAY_IN_WEEK\n DAY_IN_MONTH\n DAY_IN_YEAR\n WEEK_IN_MONTH\n WEEK_IN_YEAR\n CALENDAR_MONTH\n CALENDAR_QUARTER\n CALENDAR_YEAR\n FISCAL_MONTH\n FISCAL_QUARTER\n FISCAL_YEAR\n DAY_ONLY\n HOUR_IN_DAY\n}\n\ntype RecordTypeInfo {\n available: Boolean!\n defaultRecordTypeMapping: Boolean!\n master: Boolean!\n name: String\n recordTypeId: ID\n}\n\ntype BooleanValue implements FieldValue {\n value: Boolean\n displayValue: String\n}\n\ntype ReferenceToInfo {\n ApiName: String!\n nameFields: [String]!\n objectInfo: ObjectInfo\n}\n\ninterface FieldValue {\n displayValue: String\n}\n\ntype LongitudeValue implements FieldValue {\n value: Longitude\n displayValue: String\n}\n\ntype StringValue implements FieldValue {\n value: String\n displayValue: String\n label: String\n}\n\ntype IntValue implements FieldValue {\n value: Int\n displayValue: String\n format: String\n}\n\ntype UrlValue implements FieldValue {\n value: Url\n displayValue: String\n}\n\ninput IdOperators {\n eq: ID\n ne: ID\n lt: ID\n gt: ID\n lte: ID\n gte: ID\n in: [ID]\n nin: [ID]\n inq: JoinInput\n ninq: JoinInput\n}\n\ntype LongAggregate implements FieldValue {\n value: Long\n displayValue: String\n avg: DoubleValue\n count: LongValue\n countDistinct: LongValue\n format: String\n grouping: IntValue\n max: LongValue\n min: LongValue\n sum: LongValue\n}\n\ntype PhoneNumberAggregate implements FieldValue {\n value: PhoneNumber\n displayValue: String\n count: LongValue\n countDistinct: LongValue\n grouping: IntValue\n max: PhoneNumberValue\n min: PhoneNumberValue\n}\n\ninput TimeOperators {\n eq: Time\n ne: Time\n lt: Time\n gt: Time\n lte: Time\n gte: Time\n in: [Time]\n nin: [Time]\n}\n\ntype PicklistValue implements FieldValue {\n value: Picklist\n displayValue: String\n label: String\n}\n\ntype CurrencyAggregate implements FieldValue {\n value: Currency\n displayValue: String\n avg: DoubleValue\n count: LongValue\n countDistinct: LongValue\n format: String\n max: CurrencyValue\n min: CurrencyValue\n sum: CurrencyValue\n}\n\ntype RelatedListInfo {\n childApiName: String!\n relatedListName: String!\n label: String!\n displayColumns: [ListColumn!]!\n orderedByInfo: [ListOrder!]!\n parentApiName: String!\n fieldApiName: String!\n}\n\ninput StringOperators {\n eq: String\n ne: String\n like: String\n lt: String\n gt: String\n lte: String\n gte: String\n in: [String]\n nin: [String]\n}\n\ntype UIAPI {\n query: RecordQuery!\n aggregate: RecordQueryAggregate!\n objectInfos(apiNames: [String]): [ObjectInfo]\n relatedListByName(parentApiName: String!, relatedListName: String!): RelatedListInfo\n}\n\ninput MultiPicklistOperators {\n eq: MultiPicklist\n ne: MultiPicklist\n includes: [MultiPicklist]\n excludes: [MultiPicklist]\n}\n\ntype DateTimeAggregate implements FieldValue {\n value: DateTime\n displayValue: String\n calendarMonth: DateFunctionAggregation\n calendarQuarter: DateFunctionAggregation\n calendarYear: DateFunctionAggregation\n count: LongValue\n countDistinct: LongValue\n dayInMonth: DateFunctionAggregation\n dayInWeek: DateFunctionAggregation\n dayInYear: DateFunctionAggregation\n dayOnly: DateOnlyAggregation\n fiscalMonth: DateFunctionAggregation\n fiscalQuarter: DateFunctionAggregation\n fiscalYear: DateFunctionAggregation\n format: String\n hourInDay: DateFunctionAggregation\n max: DateTimeValue\n min: DateTimeValue\n weekInMonth: DateFunctionAggregation\n weekInYear: DateFunctionAggregation\n}\n\ninput BooleanOperators {\n eq: Boolean\n ne: Boolean\n}\n\ntype EmailAggregate implements FieldValue {\n value: Email\n displayValue: String\n count: LongValue\n countDistinct: LongValue\n grouping: IntValue\n max: EmailValue\n min: EmailValue\n}\n\ninput GroupByDateFunction {\n function: GroupByFunction\n}\n\ntype RichTextAreaValue implements FieldValue {\n value: RichTextArea\n displayValue: String\n}\n\ntype MultiPicklistValue implements FieldValue {\n value: MultiPicklist\n displayValue: String\n label: String\n}\n\ntype TimeAggregate implements FieldValue {\n value: Time\n displayValue: String\n format: String\n hourInDay: DateFunctionAggregation\n}\n\ntype __Type {\n kind: __TypeKind!\n name: String\n description: String\n fields(includeDeprecated: Boolean = false): [__Field!]\n interfaces: [__Type!]\n possibleTypes: [__Type!]\n enumValues(includeDeprecated: Boolean = false): [__EnumValue!]\n inputFields: [__InputValue!]\n ofType: __Type\n}\n\ntype ListColumn {\n fieldApiName: String!\n label: String!\n lookupId: String\n sortable: Boolean\n}\n\ntype LatitudeAggregate implements FieldValue {\n value: Latitude\n displayValue: String\n avg: DoubleValue\n count: LongValue\n countDistinct: LongValue\n max: LatitudeValue\n min: LatitudeValue\n sum: DoubleValue\n}\n\ninput CurrencyOperators {\n eq: Currency\n ne: Currency\n lt: Currency\n gt: Currency\n lte: Currency\n gte: Currency\n in: [Currency]\n nin: [Currency]\n}\n\ninput DistanceInput {\n latitude: Latitude!\n longitude: Longitude!\n}\n\nunion PolymorphicParentRelationship @generic = RecordRepresentation\n\ntype LongTextAreaValue implements FieldValue {\n value: LongTextArea\n displayValue: String\n}\n\ntype LatitudeValue implements FieldValue {\n value: Latitude\n displayValue: String\n}\n\ninput OrderByClause {\n order: ResultOrder\n nulls: NullOrder\n}\n\ninput GroupByClause {\n group: Boolean\n}\n\ntype RecordAggregateConnection @generic {\n edges: [RecordAggregateEdge]\n pageInfo: PageInfo!\n totalCount: Int!\n}\n\ntype LongitudeAggregate implements FieldValue {\n value: Longitude\n displayValue: String\n avg: DoubleValue\n count: LongValue\n countDistinct: LongValue\n max: LongitudeValue\n min: LongitudeValue\n sum: DoubleValue\n}\n\ntype RecordEdge @generic {\n node: RecordRepresentation\n cursor: String!\n}\n\ntype DateValue implements FieldValue {\n value: Date\n displayValue: String\n format: String\n}\n\ninput URLOperators {\n eq: Url\n ne: Url\n like: Url\n lt: Url\n gt: Url\n lte: Url\n gte: Url\n in: [Url]\n nin: [Url]\n}\n\ninput LongOperators {\n eq: Long\n ne: Long\n lt: Long\n gt: Long\n lte: Long\n gte: Long\n in: [Long]\n nin: [Long]\n}\n\nenum DataType {\n STRING\n TEXTAREA\n PHONE\n EMAIL\n URL\n ENCRYPTEDSTRING\n BOOLEAN\n CURRENCY\n INT\n LONG\n DOUBLE\n PERCENT\n DATETIME\n TIME\n DATE\n REFERENCE\n PICKLIST\n MULTIPICKLIST\n ADDRESS\n LOCATION\n BASE64\n COMPLEXVALUE\n COMBOBOX\n JSON\n JUNCTIONIDLIST\n ANYTYPE\n}\n\nenum NullOrder {\n LAST\n FIRST\n}\n\ntype PhoneNumberValue implements FieldValue {\n value: PhoneNumber\n displayValue: String\n}\n\n# Cannot have empty enum\n# enum RecordScope @generic {\n# }\n\ntype DoubleAggregate implements FieldValue {\n value: Double\n displayValue: String\n avg: DoubleValue\n count: LongValue\n countDistinct: LongValue\n format: String\n max: DoubleValue\n min: DoubleValue\n sum: DoubleValue\n}\n\ntype __Field {\n name: String!\n description: String\n args: [__InputValue!]!\n type: __Type!\n isDeprecated: Boolean!\n deprecationReason: String\n}\n\ninput DateOperators {\n eq: DateInput\n ne: DateInput\n lt: DateInput\n gt: DateInput\n lte: DateInput\n gte: DateInput\n in: [DateInput]\n nin: [DateInput]\n DAY_IN_WEEK: DateFunctionInput\n DAY_IN_MONTH: DateFunctionInput\n DAY_IN_YEAR: DateFunctionInput\n WEEK_IN_MONTH: DateFunctionInput\n WEEK_IN_YEAR: DateFunctionInput\n CALENDAR_MONTH: DateFunctionInput\n CALENDAR_QUARTER: DateFunctionInput\n CALENDAR_YEAR: DateFunctionInput\n FISCAL_MONTH: DateFunctionInput\n FISCAL_QUARTER: DateFunctionInput\n FISCAL_YEAR: DateFunctionInput\n}\n\ninput GeolocationInput {\n latitude: Latitude!\n longitude: Longitude!\n radius: Float!\n unit: Unit!\n}\n\ninput JoinInput {\n Record: RecordFilter @fieldCategory\n ApiName: String\n}\n\ninput TextAreaOperators {\n eq: TextArea\n ne: TextArea\n like: TextArea\n lt: TextArea\n gt: TextArea\n lte: TextArea\n gte: TextArea\n in: [TextArea]\n nin: [TextArea]\n}\n\ntype TextAreaValue implements FieldValue {\n value: TextArea\n displayValue: String\n}\n\ninput PercentOperators {\n eq: Percent\n ne: Percent\n lt: Percent\n gt: Percent\n lte: Percent\n gte: Percent\n in: [Percent]\n nin: [Percent]\n}\n\ntype DoubleValue implements FieldValue {\n value: Double\n displayValue: String\n format: String\n}\n\ntype IDAggregate implements FieldValue {\n value: ID\n displayValue: String\n count: LongValue\n countDistinct: LongValue\n grouping: IntValue\n max: IDValue\n min: IDValue\n}\n\ntype __InputValue {\n name: String!\n description: String\n type: __Type!\n defaultValue: String\n}\n\ntype RecordAggregateEdge @generic {\n node: RecordResult\n cursor: String!\n}\n\ntype __Directive {\n name: String\n description: String\n locations: [__DirectiveLocation!]\n args: [__InputValue!]!\n}\n\ntype ThemeInfo {\n color: String\n iconUrl: String\n}\n\ntype UrlAggregate implements FieldValue {\n value: Url\n displayValue: String\n count: LongValue\n countDistinct: LongValue\n grouping: IntValue\n max: UrlValue\n min: UrlValue\n}\n\nenum DateLiteral {\n THIS_WEEK\n THIS_FISCAL_QUARTER\n NEXT_YEAR\n TODAY\n LAST_WEEK\n LAST_YEAR\n YESTERDAY\n NEXT_MONTH\n NEXT_FISCAL_YEAR\n NEXT_WEEK\n NEXT_90_DAYS\n LAST_FISCAL_QUARTER\n LAST_FISCAL_YEAR\n THIS_YEAR\n THIS_MONTH\n THIS_QUARTER\n LAST_90_DAYS\n NEXT_FISCAL_QUARTER\n THIS_FISCAL_YEAR\n TOMORROW\n NEXT_QUARTER\n LAST_MONTH\n LAST_QUARTER\n}\n\ntype __EnumValue {\n name: String!\n description: String\n isDeprecated: Boolean!\n deprecationReason: String\n}\n\ntype RecordRepresentation implements Record @generic{\n Id: ID!\n ApiName: String!\n WeakEtag: Long!\n DisplayValue: String\n LastModifiedById: IDValue\n LastModifiedDate: DateTimeValue\n SystemModstamp: DateTimeValue\n RecordTypeId(fallback: Boolean): IDValue\n IntValue: IntValue @fieldCategory\n StringValue: StringValue @fieldCategory\n BooleanValue: BooleanValue @fieldCategory\n IDValue: IDValue @fieldCategory\n DateTimeValue: DateTimeValue @fieldCategory\n TimeValue: TimeValue @fieldCategory\n DateValue: DateValue @fieldCategory\n TextAreaValue: TextAreaValue @fieldCategory\n LongTextAreaValue: LongTextAreaValue @fieldCategory\n RichTextAreaValue: RichTextAreaValue @fieldCategory\n PhoneNumberValue: PhoneNumberValue @fieldCategory\n EmailValue: EmailValue @fieldCategory\n UrlValue: UrlValue @fieldCategory\n EncryptedStringValue: EncryptedStringValue @fieldCategory\n CurrencyValue: CurrencyValue @fieldCategory\n LongitudeValue: LongitudeValue @fieldCategory\n LatitudeValue: LatitudeValue @fieldCategory\n PicklistValue: PicklistValue @fieldCategory\n MultiPicklistValue: MultiPicklistValue @fieldCategory\n LongValue: LongValue @fieldCategory\n DoubleValue: DoubleValue @fieldCategory\n PercentValue: PercentValue @fieldCategory\n Base64Value: Base64Value @fieldCategory\n JSONValue: JSONValue @fieldCategory\n parentRelationship: RecordRepresentation @fieldCategory\n polymorphicParentRelationship: PolymorphicParentRelationship @fieldCategory\n childRelationship(first: Int, after: String, where: RecordFilter, orderBy: RecordOrderBy): RecordConnection @fieldCategory\n}\n\ntype IDValue implements FieldValue {\n value: ID\n displayValue: String\n}\n\nenum Unit {\n MI\n KM\n}\n\ninput OrderByGeolocationClause {\n distance: DistanceInput\n order: ResultOrder\n nulls: NullOrder\n}\n\ntype TextAreaAggregate implements FieldValue {\n value: TextArea\n displayValue: String\n count: LongValue\n countDistinct: LongValue\n grouping: IntValue\n max: TextAreaValue\n min: TextAreaValue\n}\n\nenum GroupByType {\n GROUP_BY\n ROLLUP\n CUBE\n}\n\nenum ResultOrder {\n DESC\n ASC\n}\n\ninput RecordOrderBy @generic {\n orderableField: OrderByClause @fieldCategory\n orderableGeolocationField: OrderByGeolocationClause @fieldCategory\n orderableParentRelationship: RecordOrderBy @fieldCategory\n orderablePolymorphicParentRelationship: PolymorphicParentRelationshipRecordOrderBy @fieldCategory\n}\n\ninput PicklistOperators {\n eq: Picklist\n ne: Picklist\n in: [Picklist]\n nin: [Picklist]\n}\n\ninput RecordFilter @generic {\n and: [RecordFilter]\n or: [RecordFilter]\n not: RecordFilter\n parentRelationshipRecordFilter: RecordFilter @fieldCategory\n polymorphicParentRelationshipRecordFilter: PolymorphicParentRelationshipRecordFilter @fieldCategory\n IntegerOperator: IntegerOperators @fieldCategory\n LongOperator: LongOperators @fieldCategory\n StringOperator: StringOperators @fieldCategory\n DoubleOperator: DoubleOperators @fieldCategory\n PercentOperator: PercentOperators @fieldCategory\n LongitudeOperator: LongitudeOperators @fieldCategory\n LatitudeOperator: LatitudeOperators @fieldCategory\n EmailOperator: EmailOperators @fieldCategory\n TextAreaOperator: TextAreaOperators @fieldCategory\n LongTextAreaOperator: LongTextAreaOperators @fieldCategory\n URLOperator: URLOperators @fieldCategory\n PhoneNumberOperator: PhoneNumberOperators @fieldCategory\n BooleanOperator: BooleanOperators @fieldCategory\n IdOperator: IdOperators @fieldCategory\n CurrencyOperator: CurrencyOperators @fieldCategory\n TimeOperator: TimeOperators @fieldCategory\n DateOperator: DateOperators @fieldCategory\n DateTimeOperator: DateTimeOperators @fieldCategory\n PicklistOperator: PicklistOperators @fieldCategory\n MultiPicklistOperator: MultiPicklistOperators @fieldCategory\n GeolocationOperator: GeolocationOperators @fieldCategory\n}\n\ntype TimeValue implements FieldValue {\n value: Time\n displayValue: String\n format: String\n}\n\ninput GeolocationOperators {\n lt: GeolocationInput\n gt: GeolocationInput\n}\n\ntype PicklistAggregate implements FieldValue {\n value: Picklist\n displayValue: String\n count: LongValue\n countDistinct: LongValue\n grouping: IntValue\n label: String\n max: PicklistValue\n min: PicklistValue\n}\n\ninput LatitudeOperators {\n eq: Latitude\n ne: Latitude\n lt: Latitude\n gt: Latitude\n lte: Latitude\n gte: Latitude\n in: [Latitude]\n nin: [Latitude]\n}\n\ntype DateTimeValue implements FieldValue {\n value: DateTime\n displayValue: String\n format: String\n}\n\nenum __DirectiveLocation {\n QUERY\n MUTATION\n FIELD\n FRAGMENT_DEFINITION\n FRAGMENT_SPREAD\n INLINE_FRAGMENT\n SCHEMA\n SCALAR\n OBJECT\n FIELD_DEFINITION\n ARGUMENT_DEFINITION\n INTERFACE\n UNION\n ENUM\n ENUM_VALUE\n INPUT_OBJECT\n INPUT_FIELD_DEFINITION\n}\n\ntype IntAggregate implements FieldValue {\n value: Int\n displayValue: String\n avg: DoubleValue\n count: LongValue\n countDistinct: LongValue\n format: String\n grouping: IntValue\n max: IntValue\n min: IntValue\n sum: LongValue\n}\n\ntype ListOrder {\n fieldApiName: String!\n sortDirection: ResultOrder\n}\n\ntype RecordAggregate @generic {\n ApiName: String!\n BooleanAggregate: BooleanAggregate @fieldCategory\n CurrencyAggregate: CurrencyAggregate @fieldCategory\n DateAggregate: DateAggregate @fieldCategory\n DoubleAggregate: DoubleAggregate @fieldCategory\n EmailAggregate: EmailAggregate @fieldCategory\n IDAggregate: IDAggregate @fieldCategory\n IntAggregate: IntAggregate @fieldCategory\n LatitudeAggregate: LatitudeAggregate @fieldCategory\n LongitudeAggregate: LongitudeAggregate @fieldCategory\n LongAggregate: LongAggregate @fieldCategory\n PercentAggregate: PercentAggregate @fieldCategory\n PhoneNumberAggregate: PhoneNumberAggregate @fieldCategory\n PicklistAggregate: PicklistAggregate @fieldCategory\n StringAggregate: StringAggregate @fieldCategory\n TextAreaAggregate: TextAreaAggregate @fieldCategory\n TimeAggregate: TimeAggregate @fieldCategory\n UrlAggregate: UrlAggregate @fieldCategory\n}\n\ntype JSONValue implements FieldValue {\n value: JSON\n displayValue: String\n}\n\ntype EmailValue implements FieldValue {\n value: Email\n displayValue: String\n}\n\ntype LongValue implements FieldValue {\n value: Long\n displayValue: String\n format: String\n}\n\ninput DateFunctionInput {\n value: LongOperators\n convertTimezoneValue: LongOperators\n}\n\ntype DependentField {\n controllingField: String!\n dependentFields: [String]!\n}\n\ninput LongTextAreaOperators {\n eq: LongTextArea\n ne: LongTextArea\n like: LongTextArea\n lt: LongTextArea\n gt: LongTextArea\n lte: LongTextArea\n gte: LongTextArea\n in: [LongTextArea]\n nin: [LongTextArea]\n}\n\nenum __TypeKind {\n SCALAR\n OBJECT\n INTERFACE\n UNION\n ENUM\n INPUT_OBJECT\n LIST\n NON_NULL\n}\n\ntype PercentValue implements FieldValue {\n value: Percent\n displayValue: String\n format: String\n}\n\ninput DateTimeOperators {\n eq: DateTimeInput\n ne: DateTimeInput\n lt: DateTimeInput\n gt: DateTimeInput\n lte: DateTimeInput\n gte: DateTimeInput\n in: [DateTimeInput]\n nin: [DateTimeInput]\n DAY_IN_WEEK: DateFunctionInput\n DAY_IN_MONTH: DateFunctionInput\n DAY_IN_YEAR: DateFunctionInput\n WEEK_IN_MONTH: DateFunctionInput\n WEEK_IN_YEAR: DateFunctionInput\n CALENDAR_MONTH: DateFunctionInput\n CALENDAR_QUARTER: DateFunctionInput\n CALENDAR_YEAR: DateFunctionInput\n FISCAL_MONTH: DateFunctionInput\n FISCAL_QUARTER: DateFunctionInput\n FISCAL_YEAR: DateFunctionInput\n DAY_ONLY: DateTimeFunctionInput\n HOUR_IN_DAY: DateFunctionInput\n}\n\ntype BooleanAggregate implements FieldValue {\n value: Boolean\n displayValue: String\n grouping: IntValue\n}\n\ntype RecordQueryAggregate {\n recordQueryAggregate(first: Int, after: String, where: RecordFilter, orderBy: RecordOrderBy, scope: String, groupBy: RecordGroupBy): RecordAggregateConnection @fieldCategory\n}\n\ntype RecordConnection @generic {\n edges: [RecordEdge]\n pageInfo: PageInfo!\n totalCount: Int!\n}\n\ntype FilteredLookupInfo {\n controllingFields: [String]!\n dependent: Boolean!\n optionalFilter: Boolean!\n}\n\ninput PhoneNumberOperators {\n eq: PhoneNumber\n ne: PhoneNumber\n like: PhoneNumber\n lt: PhoneNumber\n gt: PhoneNumber\n lte: PhoneNumber\n gte: PhoneNumber\n in: [PhoneNumber]\n nin: [PhoneNumber]\n}\n\ntype ObjectInfo {\n ApiName: String!\n childRelationships: [ChildRelationship]!\n createable: Boolean!\n custom: Boolean!\n defaultRecordTypeId: ID\n deletable: Boolean!\n dependentFields: [DependentField]!\n feedEnabled: Boolean!\n fields: [Field]!\n keyPrefix: String\n label: String\n labelPlural: String\n layoutable: Boolean!\n mruEnabled: Boolean!\n nameFields: [String]!\n queryable: Boolean!\n recordTypeInfos: [RecordTypeInfo]!\n searchable: Boolean!\n themeInfo: ThemeInfo\n updateable: Boolean!\n}\n\ninput LongitudeOperators {\n eq: Longitude\n ne: Longitude\n lt: Longitude\n gt: Longitude\n lte: Longitude\n gte: Longitude\n in: [Longitude]\n nin: [Longitude]\n}\n\ntype Field {\n ApiName: String!\n calculated: Boolean!\n compound: Boolean!\n compoundComponentName: String\n compoundFieldName: String\n controllerName: String\n controllingFields: [String]!\n createable: Boolean!\n custom: Boolean!\n dataType: DataType\n extraTypeInfo: FieldExtraTypeInfo\n filterable: Boolean!\n filteredLookupInfo: FilteredLookupInfo\n highScaleNumber: Boolean!\n htmlFormatted: Boolean!\n inlineHelpText: String\n label: String\n nameField: Boolean!\n polymorphicForeignKey: Boolean!\n precision: Int\n reference: Boolean!\n referenceTargetField: String\n referenceToInfos: [ReferenceToInfo]!\n relationshipName: String\n required: Boolean!\n scale: Int\n searchPrefilterable: Boolean\n sortable: Boolean!\n updateable: Boolean!\n}\n\nenum FieldExtraTypeInfo {\n IMAGE_URL\n EXTERNAL_LOOKUP\n INDIRECT_LOOKUP\n PERSONNAME\n SWITCHABLE_PERSONNAME\n PLAINTEXTAREA\n RICHTEXTAREA\n}\n\ntype RateLimit {\n cost: Long\n limit: Long\n remaining: Long\n resetAt: DateTime\n}\n\ninput DateRange {\n last_n_days: Int\n next_n_days: Int\n last_n_weeks: Int\n next_n_weeks: Int\n last_n_months: Int\n next_n_months: Int\n last_n_quarters: Int\n next_n_quarters: Int\n last_n_fiscal_quarters: Int\n next_n_fiscal_quarters: Int\n last_n_years: Int\n next_n_years: Int\n last_n_fiscal_years: Int\n next_n_fiscal_years: Int\n n_days_ago: Int\n n_weeks_ago: Int\n n_months_ago: Int\n n_quarters_ago: Int\n n_years_ago: Int\n n_fiscal_quarters_ago: Int\n n_fiscal_years_ago: Int\n}\n\ninput DateTimeFunctionInput {\n value: DateTimePrimitiveOperators\n convertTimezoneValue: DateTimePrimitiveOperators\n}\n\ntype Base64Value implements FieldValue {\n value: Base64\n displayValue: String\n}\n\ninput IntegerOperators {\n eq: Int\n ne: Int\n lt: Int\n gt: Int\n lte: Int\n gte: Int\n in: [Int]\n nin: [Int]\n}\n\ntype EncryptedStringValue implements FieldValue {\n value: EncryptedString\n displayValue: String\n}\n\ninterface Record {\n Id: ID!\n ApiName: String!\n WeakEtag: Long!\n DisplayValue: String\n LastModifiedById: IDValue\n LastModifiedDate: DateTimeValue\n SystemModstamp: DateTimeValue\n RecordTypeId(fallback: Boolean): IDValue\n}\n\ninput PolymorphicParentRelationshipRecordFilter @generic {\n RecordFilter: RecordFilter @fieldCategory\n}\n\ntype __Schema {\n types: [__Type!]!\n queryType: __Type!\n mutationType: __Type\n directives: [__Directive!]!\n subscriptionType: __Type\n}\n\ninput DateTimeInput {\n value: DateTime\n literal: DateLiteral\n range: DateRange\n}\n\ninput DateTimePrimitiveOperators {\n eq: DateTime\n ne: DateTime\n lt: DateTime\n gt: DateTime\n lte: DateTime\n gte: DateTime\n in: [DateTime]\n nin: [DateTime]\n}\n\ntype ChildRelationship {\n childObjectApiName: String!\n fieldName: String\n junctionIdListNames: [String]!\n junctionReferenceTo: [String]!\n relationshipName: String\n objectInfo: ObjectInfo\n}\n\ntype RecordResult @generic {\n aggregate: RecordAggregate\n}\n\ntype PageInfo {\n hasNextPage: Boolean!\n hasPreviousPage: Boolean!\n startCursor: String\n endCursor: String\n}\n\ntype CurrencyValue implements FieldValue {\n value: Currency\n displayValue: String\n format: String\n}\n\ninput DateInput {\n value: Date\n literal: DateLiteral\n range: DateRange\n}\n\ninput RecordGroupBy @generic {\n groupableField: GroupByClause @fieldCategory\n groupableDateField: GroupByDateFunction @fieldCategory\n groupableParentRelationship: RecordGroupBy @fieldCategory\n groupablePolymorphicParentRelationship: PolymorphicParentRelationshipGroupBy @fieldCategory\n type: GroupByType = GROUP_BY\n}\n\ntype DateFunctionAggregation {\n value: Long\n format: String\n}\n\ntype RecordQuery {\n # scope should be type RecordScope but it cannot currently be used\n recordQuery(first: Int, after: String, where: RecordFilter, orderBy: RecordOrderBy, scope: String): RecordConnection @fieldCategory\n}\n\ndirective @generic on OBJECT | INTERFACE | UNION | ENUM | INPUT_OBJECT\ndirective @fieldCategory on FIELD_DEFINITION | ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION | ENUM_VALUE\ndirective @category on FIELD\n\n\n\n\n\n\n\n";
52754
52963
 
@@ -57951,7 +58160,7 @@ function makeNetworkAdapterChunkRecordFields(networkAdapter) {
57951
58160
  }, networkAdapter);
57952
58161
  }
57953
58162
 
57954
- const { keys: keys$8, create: create$6, assign: assign$5, entries } = Object;
58163
+ const { keys: keys$8, create: create$6, assign: assign$6, entries } = Object;
57955
58164
  const { stringify: stringify$6, parse: parse$6 } = JSON;
57956
58165
  const { push, join, slice } = Array.prototype;
57957
58166
 
@@ -59698,7 +59907,7 @@ register({
59698
59907
  id: '@salesforce/lds-network-adapter',
59699
59908
  instrument: instrument$1,
59700
59909
  });
59701
- // version: 1.152.4-cef16daed
59910
+ // version: 1.154.0-3a36aab7e
59702
59911
 
59703
59912
  const { create: create$2, keys: keys$2 } = Object;
59704
59913
  const { stringify: stringify$1, parse: parse$1 } = JSON;
@@ -80543,7 +80752,7 @@ register({
80543
80752
  configuration: { ...configurationForGraphQLAdapters },
80544
80753
  instrument,
80545
80754
  });
80546
- // version: 1.152.4-044bf00f2
80755
+ // version: 1.154.0-492daee11
80547
80756
 
80548
80757
  // On core the unstable adapters are re-exported with different names,
80549
80758
 
@@ -82790,7 +82999,7 @@ withDefaultLuvio((luvio) => {
82790
82999
  unstable_graphQL_imperative = createImperativeAdapter(luvio, createInstrumentedAdapter(ldsAdapter, adapterMetadata), adapterMetadata);
82791
83000
  graphQLImperative = ldsAdapter;
82792
83001
  });
82793
- // version: 1.152.4-044bf00f2
83002
+ // version: 1.154.0-492daee11
82794
83003
 
82795
83004
  var gqlApi = /*#__PURE__*/Object.freeze({
82796
83005
  __proto__: null,
@@ -83479,4 +83688,4 @@ const { luvio } = getRuntime();
83479
83688
  setDefaultLuvio({ luvio });
83480
83689
 
83481
83690
  export { createPrimingSession, draftManager, draftQueue, executeAdapter, executeMutatingAdapter, getImperativeAdapterNames, invokeAdapter, invokeAdapterWithDraftToReplace, invokeAdapterWithMetadata, nimbusDraftQueue, registerReportObserver, setMetadataTTL, setUiApiRecordTTL, subscribeToAdapter };
83482
- // version: 1.152.4-cef16daed
83691
+ // version: 1.154.0-3a36aab7e