@salesforce/lds-adapters-uiapi 1.228.0 → 1.229.0-dev1
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.
- package/dist/es/es2018/types/src/generated/graphql/types/type-util.d.ts +4 -6
- package/dist/es/es2018/types/src/graphql-artifacts/types/RecordRepresentation/getInContextFragmentType.d.ts +1 -1
- package/dist/es/es2018/uiapi-records-service.js +16 -122
- package/package.json +7 -7
- package/sfdc/graphqlAdapters.js +10 -122
- package/sfdc/index.js +8 -2
- package/sfdc/uiapi-static-functions.js +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { StoreLink as $64$luvio_engine_StoreLink, IngestPath as $64$luvio_engine_IngestPath, Luvio as $64$luvio_engine_Luvio, Store as $64$luvio_engine_Store, NormalizedKeyMetadata as $64$luvio_engine_NormalizedKeyMetadata, SelectionPropertyKey as $64$luvio_engine_SelectionPropertyKey, Reader as $64$luvio_engine_Reader } from '@luvio/engine';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { GraphQLVariables as $64$luvio_graphql_GraphQLVariables, GraphQLFragmentMap as $64$luvio_graphql_GraphQLFragmentMap, IsFragmentApplicableType as $64$luvio_graphql_IsFragmentApplicableType } from '@luvio/graphql';
|
|
3
|
+
import { FieldNode as $64$luvio_graphql$45$parser_FieldNode, FragmentSpreadNode as $64$luvio_graphql$45$parser_FragmentSpreadNode, InlineFragmentNode as $64$luvio_graphql$45$parser_InlineFragmentNode, SelectionNode as $64$luvio_graphql$45$parser_SelectionNode, OperationDefinitionNode as $64$luvio_graphql$45$parser_OperationDefinitionNode, DocumentNode as $64$luvio_graphql$45$parser_DocumentNode, SelectionSetNode as $64$luvio_graphql$45$parser_SelectionSetNode, ArgumentNode as $64$luvio_graphql$45$parser_ArgumentNode, FragmentDefinitionNode as $64$luvio_graphql$45$parser_FragmentDefinitionNode, VariableDefinitionNode as $64$luvio_graphql$45$parser_VariableDefinitionNode } from '@luvio/graphql-parser';
|
|
4
4
|
import { PaginationMetadata as pagination_cursor_PaginationMetadata, PaginationParams as pagination_cursor_PaginationParams, PageMetadata as pagination_cursor_PageMetadata } from '../../pagination/cursor';
|
|
5
5
|
export type NormalizedGraphQL<D = undefined> = {
|
|
6
6
|
data: Record<string, any>;
|
|
@@ -11,7 +11,6 @@ export type GraphQLTypeDetails = {
|
|
|
11
11
|
isArray: boolean;
|
|
12
12
|
typename: string;
|
|
13
13
|
};
|
|
14
|
-
type IsFragmentApplicableType = (fragment: $64$luvio_graphql$45$parser_FragmentDefinitionNode | $64$luvio_graphql$45$parser_InlineFragmentNode, typename: string) => boolean;
|
|
15
14
|
export interface GraphQLState<D = unknown> {
|
|
16
15
|
data: D;
|
|
17
16
|
path: $64$luvio_engine_IngestPath;
|
|
@@ -44,7 +43,7 @@ export declare function createLink(ref: string | $64$luvio_engine_NormalizedKeyM
|
|
|
44
43
|
};
|
|
45
44
|
interface IngestBaseParams<AstNodeType, StateType> {
|
|
46
45
|
key: string | $64$luvio_engine_NormalizedKeyMetadata;
|
|
47
|
-
isFragmentApplicable:
|
|
46
|
+
isFragmentApplicable: $64$luvio_graphql_IsFragmentApplicableType;
|
|
48
47
|
isMappedFieldImport: (field: $64$luvio_graphql$45$parser_FieldNode) => boolean;
|
|
49
48
|
getFieldType: (field: $64$luvio_graphql$45$parser_FieldNode) => {
|
|
50
49
|
isArray: boolean;
|
|
@@ -80,7 +79,6 @@ export declare function injectSelectionSet(selectionSetNode: $64$luvio_graphql$4
|
|
|
80
79
|
export declare function getPageMetadata(paginationMetadata: pagination_cursor_PaginationMetadata | undefined, paginationParams: pagination_cursor_PaginationParams): pagination_cursor_PageMetadata;
|
|
81
80
|
export declare function isCursorConnectionType(fieldType: GraphQLTypeDetails | undefined): boolean;
|
|
82
81
|
export declare function getSerializedKeyForField(field: $64$luvio_graphql$45$parser_FieldNode, variables: $64$luvio_graphql_GraphQLVariables, fieldType: GraphQLTypeDetails | undefined): string;
|
|
83
|
-
export declare function getRequestedFieldsForType(typename: string, selectionSet: $64$luvio_graphql$45$parser_SelectionSetNode, namedFragmentsMap: $64$luvio_graphql_GraphQLFragmentMap, isFragmentApplicable: IsFragmentApplicableType): Map<string, $64$luvio_graphql$45$parser_FieldNode>;
|
|
84
82
|
export declare function getQueryTransformerForType(typename: string, fragmentMap: $64$luvio_graphql_GraphQLFragmentMap): QueryTransformHelper | undefined;
|
|
85
83
|
export declare function sharedGetFragmentType(fragment: $64$luvio_graphql$45$parser_FragmentSpreadNode | $64$luvio_graphql$45$parser_InlineFragmentNode, fragmentMap: $64$luvio_graphql_GraphQLFragmentMap): string | undefined;
|
|
86
84
|
export declare function getSelectionSetFromFragment(fragment: $64$luvio_graphql$45$parser_FragmentSpreadNode | $64$luvio_graphql$45$parser_InlineFragmentNode, fragmentMap: $64$luvio_graphql_GraphQLFragmentMap): $64$luvio_graphql$45$parser_SelectionSetNode | undefined;
|
|
@@ -88,7 +86,7 @@ export declare function getCursorConnectionMinimumSelections(): $64$luvio_graphq
|
|
|
88
86
|
export declare function evaluateArgumentValue(argumentNode: $64$luvio_graphql$45$parser_ArgumentNode | undefined, expectedKind: 'IntValue' | 'FloatValue' | 'StringValue' | 'BooleanValue' | 'EnumValue', variables: $64$luvio_graphql_GraphQLVariables): any | undefined;
|
|
89
87
|
export declare function getArrayOffsetForPage(state: GraphQLIngestState<any>, node: $64$luvio_graphql$45$parser_FieldNode, key: string | $64$luvio_engine_NormalizedKeyMetadata): number;
|
|
90
88
|
export declare function isFragmentApplicable(fragmentNode: $64$luvio_graphql$45$parser_FragmentDefinitionNode | $64$luvio_graphql$45$parser_InlineFragmentNode, implementedInterfaces: string[], graphqlTypeName: string, typename?: string): boolean;
|
|
91
|
-
export declare function buildSelectionForNode<D = undefined>(source: NormalizedGraphQL<D>, reader: $64$luvio_engine_Reader<any>, parentNode: $64$luvio_graphql$45$parser_FieldNode | $64$luvio_graphql$45$parser_OperationDefinitionNode, selectionNode: $64$luvio_graphql$45$parser_SelectionNode, variables: $64$luvio_graphql_GraphQLVariables, fragments: $64$luvio_graphql_GraphQLFragmentMap, isFragmentApplicable:
|
|
89
|
+
export declare function buildSelectionForNode<D = undefined>(source: NormalizedGraphQL<D>, reader: $64$luvio_engine_Reader<any>, parentNode: $64$luvio_graphql$45$parser_FieldNode | $64$luvio_graphql$45$parser_OperationDefinitionNode, selectionNode: $64$luvio_graphql$45$parser_SelectionNode, variables: $64$luvio_graphql_GraphQLVariables, fragments: $64$luvio_graphql_GraphQLFragmentMap, isFragmentApplicable: $64$luvio_graphql_IsFragmentApplicableType, buildSelectionForField: (source: NormalizedGraphQL<D>, reader: $64$luvio_engine_Reader<any>, sel: $64$luvio_graphql$45$parser_FieldNode, variables: $64$luvio_graphql_GraphQLVariables, fragments: $64$luvio_graphql_GraphQLFragmentMap, parentRecordId: string) => unknown, parentRecordId: string): Record<string, any> | undefined;
|
|
92
90
|
export declare function buildSelectionForField<SourceType>(source: SourceType, reader: $64$luvio_engine_Reader<any>, sel: $64$luvio_graphql$45$parser_FieldNode, variables: $64$luvio_graphql_GraphQLVariables, fragments: $64$luvio_graphql_GraphQLFragmentMap, isCursorConnectionType: boolean, getFieldData: (source: SourceType, sel: $64$luvio_graphql$45$parser_FieldNode, variables: $64$luvio_graphql_GraphQLVariables) => any, getFieldType: (field: $64$luvio_graphql$45$parser_FieldNode) => {
|
|
93
91
|
isArray: boolean;
|
|
94
92
|
typename: string;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { FragmentSpreadNode, InlineFragmentNode } from '@luvio/graphql-parser';
|
|
2
|
-
import type { GraphQLFragmentMap } from '
|
|
2
|
+
import type { GraphQLFragmentMap } from '@luvio/graphql';
|
|
3
3
|
export declare function getInContextFragmentType(fragment: FragmentSpreadNode | InlineFragmentNode, fragmentMap: GraphQLFragmentMap): string | undefined;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { register } from '@salesforce/lds-default-luvio';
|
|
8
8
|
import { serializeStructuredKey, ingestShape, coerceConfig as coerceConfig$1, typeCheckConfig as typeCheckConfig$13, createResourceParams as createResourceParams$Z, StoreKeyMap, StoreKeySet, deepFreeze, buildNetworkSnapshotCachePolicy as buildNetworkSnapshotCachePolicy$R, coerceAdapterRequestContext, Wildcard } from '@luvio/engine';
|
|
9
9
|
import { print, visit, parse as parse$1 } from '@luvio/graphql-parser';
|
|
10
|
-
import { buildFieldState, createFragmentMap, serializeFieldArguments, buildQueryTypeStringKey, getOperationFromDocument } from '@luvio/graphql';
|
|
10
|
+
import { getRequestedFieldsForType, buildFieldState, createFragmentMap, mergeSelectionSets, serializeFieldArguments, deepMerge, buildQueryTypeStringKey, getOperationFromDocument } from '@luvio/graphql';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* Defines configuration for the module with a default value which can be overridden by the runtime environment.
|
|
@@ -5099,7 +5099,7 @@ function fulfill(existing, incoming) {
|
|
|
5099
5099
|
const batchRequestWithSingleRequest = isSingleBatchRecordRequest(existingUrlParams) &&
|
|
5100
5100
|
isSingleRecordRequest(urlParams) &&
|
|
5101
5101
|
incomingUrlRecords[0] === existingUrlRecords[0];
|
|
5102
|
-
if (!batchRequestWithSingleRequest) {
|
|
5102
|
+
if (!batchRequestWithSingleRequest || isRestrictedPathCondition(existingPath, path)) {
|
|
5103
5103
|
return false;
|
|
5104
5104
|
}
|
|
5105
5105
|
}
|
|
@@ -5142,6 +5142,12 @@ function isSingleBatchRecordRequest(urlParams) {
|
|
|
5142
5142
|
function isSingleRecordRequest(urlParams) {
|
|
5143
5143
|
return hasOwnProperty.call(urlParams, 'recordId');
|
|
5144
5144
|
}
|
|
5145
|
+
function isRestrictedPathCondition(existingPath, path) {
|
|
5146
|
+
// should not dedupe getRecordUi and getRecord as both of their representation is different
|
|
5147
|
+
// records call cannot digest response of getRecordUi
|
|
5148
|
+
return ((existingPath.includes('/record-ui') && path.includes('/records')) ||
|
|
5149
|
+
(existingPath.includes('/records') && path.includes('/record-ui')));
|
|
5150
|
+
}
|
|
5145
5151
|
|
|
5146
5152
|
const createResourceRequest$16 = function getUiApiRecordsByRecordIdCreateResourceRequest(config) {
|
|
5147
5153
|
return {
|
|
@@ -42441,13 +42447,12 @@ function injectSelectionSet(selectionSetNode, queryTransformHelper, fragmentMap)
|
|
|
42441
42447
|
selectionSetNode === undefined) {
|
|
42442
42448
|
return;
|
|
42443
42449
|
}
|
|
42444
|
-
const
|
|
42445
|
-
|
|
42446
|
-
selections
|
|
42447
|
-
|
|
42448
|
-
|
|
42449
|
-
|
|
42450
|
-
mergedSelections.forEach(selection => {
|
|
42450
|
+
const minimumSelectionSet = {
|
|
42451
|
+
kind: 'SelectionSet',
|
|
42452
|
+
selections: queryTransformHelper.getMinimumSelections()
|
|
42453
|
+
};
|
|
42454
|
+
const mergedSelections = mergeSelectionSets(selectionSetNode, minimumSelectionSet);
|
|
42455
|
+
mergedSelections === null || mergedSelections === void 0 ? void 0 : mergedSelections.selections.forEach(selection => {
|
|
42451
42456
|
if (selection.kind === 'Field') {
|
|
42452
42457
|
const fieldType = queryTransformHelper.getFieldType(selection);
|
|
42453
42458
|
const fieldTransformHelper = fieldType === undefined ? undefined : getQueryTransformerForType(fieldType.typename);
|
|
@@ -42476,46 +42481,7 @@ function injectSelectionSet(selectionSetNode, queryTransformHelper, fragmentMap)
|
|
|
42476
42481
|
}
|
|
42477
42482
|
}
|
|
42478
42483
|
});
|
|
42479
|
-
Object.assign(selectionSetNode,
|
|
42480
|
-
selections: mergedSelections.length > 0 ? mergedSelections : undefined
|
|
42481
|
-
});
|
|
42482
|
-
}
|
|
42483
|
-
function mergeSelections(minimumSelections, querySelections) {
|
|
42484
|
-
const mergedSelections = [...querySelections];
|
|
42485
|
-
for (let i = 0; i < minimumSelections.length; i++) {
|
|
42486
|
-
const minimumSelection = minimumSelections[i];
|
|
42487
|
-
if (minimumSelection.kind === 'Field') {
|
|
42488
|
-
const existingNode = mergedSelections.find(selection => {
|
|
42489
|
-
return selection.kind === 'Field' && selection.name.value === minimumSelection.name.value && (selection.directives === undefined || selection.directives.length === 0);
|
|
42490
|
-
});
|
|
42491
|
-
if (existingNode !== undefined && existingNode.kind === 'Field') { // Maybe do better type narrowing above
|
|
42492
|
-
const existingNodeHasSubselections = existingNode.selectionSet !== undefined && existingNode.selectionSet.selections.length > 0;
|
|
42493
|
-
const minimumFieldNodeHasSubselections = minimumSelection.selectionSet !== undefined && minimumSelection.selectionSet.selections.length > 0;
|
|
42494
|
-
// TODO(correctness enhancement): this doesn't handle arugments. Add alias if arguments disagree?
|
|
42495
|
-
if (existingNodeHasSubselections && minimumFieldNodeHasSubselections) {
|
|
42496
|
-
const mergedChildSelections = mergeSelections(minimumSelection.selectionSet.selections, existingNode.selectionSet.selections);
|
|
42497
|
-
Object.assign(existingNode.selectionSet, {
|
|
42498
|
-
selections: mergedChildSelections
|
|
42499
|
-
});
|
|
42500
|
-
}
|
|
42501
|
-
}
|
|
42502
|
-
else {
|
|
42503
|
-
mergedSelections.push(minimumSelection);
|
|
42504
|
-
}
|
|
42505
|
-
}
|
|
42506
|
-
if (minimumSelection.kind === 'InlineFragment') {
|
|
42507
|
-
mergedSelections.push(minimumSelection);
|
|
42508
|
-
}
|
|
42509
|
-
if (minimumSelection.kind === 'FragmentSpread') {
|
|
42510
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
42511
|
-
console.error('named fragment minimum selections are not supported and will not be added to the query.');
|
|
42512
|
-
}
|
|
42513
|
-
}
|
|
42514
|
-
}
|
|
42515
|
-
return mergedSelections;
|
|
42516
|
-
}
|
|
42517
|
-
function getRequestedField(responseDataFieldName, requestedFields) {
|
|
42518
|
-
return requestedFields.find(fieldNode => (fieldNode.alias && fieldNode.alias.value === responseDataFieldName) || (!fieldNode.alias && fieldNode.name.value === responseDataFieldName));
|
|
42484
|
+
Object.assign(selectionSetNode, mergedSelections);
|
|
42519
42485
|
}
|
|
42520
42486
|
function getPageMetadata(paginationMetadata, paginationParams) {
|
|
42521
42487
|
const metadataProperties = {};
|
|
@@ -42561,67 +42527,6 @@ function getSerializedKeyForField(field, variables, fieldType) {
|
|
|
42561
42527
|
const argumentString = mutableArgumentNodes.length > 0 ? '__' + serializeFieldArguments(mutableArgumentNodes, variables) : '';
|
|
42562
42528
|
return field.name.value + argumentString; // It should be safe to always use the fieldName - If an alias is meaningful, there will be arguments on the key also.
|
|
42563
42529
|
}
|
|
42564
|
-
function mergeFragmentWithExistingSelections(fragmentFieldSelection, existingSelections) {
|
|
42565
|
-
// Check if there is an existing selection for this field we can merge with
|
|
42566
|
-
// If this isn't done, we will see issues such as W-12293630 & W-12236456 as examples
|
|
42567
|
-
const existingField = getRequestedField(fragmentFieldSelection.name.value, existingSelections);
|
|
42568
|
-
if (existingField === undefined) {
|
|
42569
|
-
existingSelections.push(fragmentFieldSelection);
|
|
42570
|
-
}
|
|
42571
|
-
else {
|
|
42572
|
-
if (existingField.selectionSet === undefined) {
|
|
42573
|
-
existingField.selectionSet === fragmentFieldSelection.selectionSet;
|
|
42574
|
-
}
|
|
42575
|
-
else if (fragmentFieldSelection.selectionSet !== undefined) {
|
|
42576
|
-
existingField.selectionSet.selections = mergeSelections(fragmentFieldSelection.selectionSet.selections, existingField.selectionSet.selections);
|
|
42577
|
-
}
|
|
42578
|
-
}
|
|
42579
|
-
}
|
|
42580
|
-
function calculateRequestedFieldsForType(typename, selectionSet, namedFragmentsMap, isFragmentApplicable) {
|
|
42581
|
-
const selections = [];
|
|
42582
|
-
selectionSet.selections.forEach(selection => {
|
|
42583
|
-
if (selection.kind === "Field") {
|
|
42584
|
-
selections.push(selection);
|
|
42585
|
-
}
|
|
42586
|
-
if (selection.kind === "InlineFragment" && isFragmentApplicable(selection, typename)) {
|
|
42587
|
-
// loops over the map to get the values.
|
|
42588
|
-
getRequestedFieldsForType(typename, selection.selectionSet, namedFragmentsMap, isFragmentApplicable)
|
|
42589
|
-
.forEach(fragmentFieldSelection => { mergeFragmentWithExistingSelections(fragmentFieldSelection, selections); });
|
|
42590
|
-
}
|
|
42591
|
-
if (selection.kind === "FragmentSpread") {
|
|
42592
|
-
const namedFragment = namedFragmentsMap[selection.name.value];
|
|
42593
|
-
if (namedFragment && isFragmentApplicable(namedFragment, typename)) {
|
|
42594
|
-
// loops over the map to get the values.
|
|
42595
|
-
getRequestedFieldsForType(typename, namedFragment.selectionSet, namedFragmentsMap, isFragmentApplicable)
|
|
42596
|
-
.forEach(fragmentFieldSelection => { mergeFragmentWithExistingSelections(fragmentFieldSelection, selections); });
|
|
42597
|
-
}
|
|
42598
|
-
}
|
|
42599
|
-
});
|
|
42600
|
-
// Needs to happen after the selections are merged.
|
|
42601
|
-
return selections.reduce((acc, fieldNode) => {
|
|
42602
|
-
const fieldName = fieldNode.alias ? fieldNode.alias.value : fieldNode.name.value;
|
|
42603
|
-
// TODO: W-13485835. Some fields are not being merged, and this logic reproduces the current behavior in which the first field with name is being used.
|
|
42604
|
-
if (!acc.has(fieldName)) {
|
|
42605
|
-
acc.set(fieldName, fieldNode);
|
|
42606
|
-
}
|
|
42607
|
-
return acc;
|
|
42608
|
-
}, new Map());
|
|
42609
|
-
}
|
|
42610
|
-
let selectionSetRequestedFieldsWeakMap = new WeakMap();
|
|
42611
|
-
function getRequestedFieldsForType(typename, selectionSet, namedFragmentsMap, isFragmentApplicable) {
|
|
42612
|
-
let cachedRequestedFieldsConfigurations = selectionSetRequestedFieldsWeakMap.get(selectionSet);
|
|
42613
|
-
if (cachedRequestedFieldsConfigurations === undefined) {
|
|
42614
|
-
cachedRequestedFieldsConfigurations = new Map();
|
|
42615
|
-
selectionSetRequestedFieldsWeakMap.set(selectionSet, cachedRequestedFieldsConfigurations);
|
|
42616
|
-
}
|
|
42617
|
-
const cachedRequestedFieldsForType = cachedRequestedFieldsConfigurations.get(typename);
|
|
42618
|
-
if (cachedRequestedFieldsForType !== undefined) {
|
|
42619
|
-
return cachedRequestedFieldsForType;
|
|
42620
|
-
}
|
|
42621
|
-
const selections = calculateRequestedFieldsForType(typename, selectionSet, namedFragmentsMap, isFragmentApplicable);
|
|
42622
|
-
cachedRequestedFieldsConfigurations.set(typename, selections);
|
|
42623
|
-
return selections;
|
|
42624
|
-
}
|
|
42625
42530
|
function getQueryTransformerForType(typename, fragmentMap) {
|
|
42626
42531
|
switch (typename) {
|
|
42627
42532
|
case "PercentAggregate": return {
|
|
@@ -43240,18 +43145,7 @@ function selectCalculateSink(sink, field, buildSelectionForNodeFn, source, reade
|
|
|
43240
43145
|
(_a = field.selectionSet) === null || _a === void 0 ? void 0 : _a.selections.forEach((sel) => {
|
|
43241
43146
|
const builtSelection = buildSelectionForNodeFn(source, reader, field, sel, variables, fragments, parentRecordId);
|
|
43242
43147
|
if (builtSelection !== undefined) {
|
|
43243
|
-
|
|
43244
|
-
Object.keys(builtSelection).forEach((key, value) => {
|
|
43245
|
-
// We only assign a field selection in the fragment if it doesn't already exist in sink
|
|
43246
|
-
// The non-fragment selection already got the merged selections in getRequestedFieldsForType
|
|
43247
|
-
if (sink[key] === undefined) {
|
|
43248
|
-
sink[key] = builtSelection[key];
|
|
43249
|
-
}
|
|
43250
|
-
});
|
|
43251
|
-
}
|
|
43252
|
-
else {
|
|
43253
|
-
Object.assign(sink, builtSelection);
|
|
43254
|
-
}
|
|
43148
|
+
deepMerge(sink, builtSelection);
|
|
43255
43149
|
}
|
|
43256
43150
|
});
|
|
43257
43151
|
return sink;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salesforce/lds-adapters-uiapi",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.229.0-dev1",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
5
5
|
"description": "Wire adapters for record related UI API endpoints",
|
|
6
6
|
"main": "dist/es/es2018/uiapi-records-service.js",
|
|
@@ -68,15 +68,15 @@
|
|
|
68
68
|
}
|
|
69
69
|
},
|
|
70
70
|
"dependencies": {
|
|
71
|
-
"@salesforce/lds-bindings": "
|
|
72
|
-
"@salesforce/lds-default-luvio": "
|
|
71
|
+
"@salesforce/lds-bindings": "1.229.0-dev1",
|
|
72
|
+
"@salesforce/lds-default-luvio": "1.229.0-dev1"
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
75
|
"@databases/sqlite": "^3.0.0",
|
|
76
|
-
"@salesforce/lds-compiler-plugins": "
|
|
77
|
-
"@salesforce/lds-jest": "
|
|
78
|
-
"@salesforce/lds-store-binary": "
|
|
79
|
-
"@salesforce/lds-uiapi-record-utils": "
|
|
76
|
+
"@salesforce/lds-compiler-plugins": "1.229.0-dev1",
|
|
77
|
+
"@salesforce/lds-jest": "1.229.0-dev1",
|
|
78
|
+
"@salesforce/lds-store-binary": "1.229.0-dev1",
|
|
79
|
+
"@salesforce/lds-uiapi-record-utils": "1.229.0-dev1"
|
|
80
80
|
},
|
|
81
81
|
"luvioBundlesize": [
|
|
82
82
|
{
|
package/sfdc/graphqlAdapters.js
CHANGED
|
@@ -17,7 +17,7 @@ import { print, visit, parse, astResolver } from 'force/ldsGraphqlParser';
|
|
|
17
17
|
import { createInstrumentedAdapter, createLDSAdapter, createGraphQLWireAdapterConstructor, createGraphQLImperativeAdapter } from 'force/ldsBindings';
|
|
18
18
|
export { refresh as refreshGraphQL } from 'force/ldsBindings';
|
|
19
19
|
import { serializeStructuredKey, deepFreeze, buildNetworkSnapshotCachePolicy as buildNetworkSnapshotCachePolicy$2, StoreKeyMap, createResourceParams as createResourceParams$2, StoreKeySet } from 'force/luvioEngine';
|
|
20
|
-
import { buildFieldState, createFragmentMap, serializeFieldArguments, buildQueryTypeStringKey, getOperationFromDocument } from 'force/luvioGraphql';
|
|
20
|
+
import { getRequestedFieldsForType, buildFieldState, createFragmentMap, mergeSelectionSets, serializeFieldArguments, deepMerge, buildQueryTypeStringKey, getOperationFromDocument } from 'force/luvioGraphql';
|
|
21
21
|
import { createIngestRecordWithFields } from 'force/ldsAdaptersUiapi';
|
|
22
22
|
|
|
23
23
|
const { hasOwnProperty: ObjectPrototypeHasOwnProperty } = Object.prototype;
|
|
@@ -13768,13 +13768,12 @@ function injectSelectionSet(selectionSetNode, queryTransformHelper, fragmentMap)
|
|
|
13768
13768
|
selectionSetNode === undefined) {
|
|
13769
13769
|
return;
|
|
13770
13770
|
}
|
|
13771
|
-
const
|
|
13772
|
-
|
|
13773
|
-
selections
|
|
13774
|
-
|
|
13775
|
-
|
|
13776
|
-
|
|
13777
|
-
mergedSelections.forEach(selection => {
|
|
13771
|
+
const minimumSelectionSet = {
|
|
13772
|
+
kind: 'SelectionSet',
|
|
13773
|
+
selections: queryTransformHelper.getMinimumSelections()
|
|
13774
|
+
};
|
|
13775
|
+
const mergedSelections = mergeSelectionSets(selectionSetNode, minimumSelectionSet);
|
|
13776
|
+
mergedSelections === null || mergedSelections === void 0 ? void 0 : mergedSelections.selections.forEach(selection => {
|
|
13778
13777
|
if (selection.kind === 'Field') {
|
|
13779
13778
|
const fieldType = queryTransformHelper.getFieldType(selection);
|
|
13780
13779
|
const fieldTransformHelper = fieldType === undefined ? undefined : getQueryTransformerForType(fieldType.typename);
|
|
@@ -13803,46 +13802,7 @@ function injectSelectionSet(selectionSetNode, queryTransformHelper, fragmentMap)
|
|
|
13803
13802
|
}
|
|
13804
13803
|
}
|
|
13805
13804
|
});
|
|
13806
|
-
Object.assign(selectionSetNode,
|
|
13807
|
-
selections: mergedSelections.length > 0 ? mergedSelections : undefined
|
|
13808
|
-
});
|
|
13809
|
-
}
|
|
13810
|
-
function mergeSelections(minimumSelections, querySelections) {
|
|
13811
|
-
const mergedSelections = [...querySelections];
|
|
13812
|
-
for (let i = 0; i < minimumSelections.length; i++) {
|
|
13813
|
-
const minimumSelection = minimumSelections[i];
|
|
13814
|
-
if (minimumSelection.kind === 'Field') {
|
|
13815
|
-
const existingNode = mergedSelections.find(selection => {
|
|
13816
|
-
return selection.kind === 'Field' && selection.name.value === minimumSelection.name.value && (selection.directives === undefined || selection.directives.length === 0);
|
|
13817
|
-
});
|
|
13818
|
-
if (existingNode !== undefined && existingNode.kind === 'Field') { // Maybe do better type narrowing above
|
|
13819
|
-
const existingNodeHasSubselections = existingNode.selectionSet !== undefined && existingNode.selectionSet.selections.length > 0;
|
|
13820
|
-
const minimumFieldNodeHasSubselections = minimumSelection.selectionSet !== undefined && minimumSelection.selectionSet.selections.length > 0;
|
|
13821
|
-
// TODO(correctness enhancement): this doesn't handle arugments. Add alias if arguments disagree?
|
|
13822
|
-
if (existingNodeHasSubselections && minimumFieldNodeHasSubselections) {
|
|
13823
|
-
const mergedChildSelections = mergeSelections(minimumSelection.selectionSet.selections, existingNode.selectionSet.selections);
|
|
13824
|
-
Object.assign(existingNode.selectionSet, {
|
|
13825
|
-
selections: mergedChildSelections
|
|
13826
|
-
});
|
|
13827
|
-
}
|
|
13828
|
-
}
|
|
13829
|
-
else {
|
|
13830
|
-
mergedSelections.push(minimumSelection);
|
|
13831
|
-
}
|
|
13832
|
-
}
|
|
13833
|
-
if (minimumSelection.kind === 'InlineFragment') {
|
|
13834
|
-
mergedSelections.push(minimumSelection);
|
|
13835
|
-
}
|
|
13836
|
-
if (minimumSelection.kind === 'FragmentSpread') {
|
|
13837
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
13838
|
-
console.error('named fragment minimum selections are not supported and will not be added to the query.');
|
|
13839
|
-
}
|
|
13840
|
-
}
|
|
13841
|
-
}
|
|
13842
|
-
return mergedSelections;
|
|
13843
|
-
}
|
|
13844
|
-
function getRequestedField(responseDataFieldName, requestedFields) {
|
|
13845
|
-
return requestedFields.find(fieldNode => (fieldNode.alias && fieldNode.alias.value === responseDataFieldName) || (!fieldNode.alias && fieldNode.name.value === responseDataFieldName));
|
|
13805
|
+
Object.assign(selectionSetNode, mergedSelections);
|
|
13846
13806
|
}
|
|
13847
13807
|
function getPageMetadata(paginationMetadata, paginationParams) {
|
|
13848
13808
|
const metadataProperties = {};
|
|
@@ -13888,67 +13848,6 @@ function getSerializedKeyForField(field, variables, fieldType) {
|
|
|
13888
13848
|
const argumentString = mutableArgumentNodes.length > 0 ? '__' + serializeFieldArguments(mutableArgumentNodes, variables) : '';
|
|
13889
13849
|
return field.name.value + argumentString; // It should be safe to always use the fieldName - If an alias is meaningful, there will be arguments on the key also.
|
|
13890
13850
|
}
|
|
13891
|
-
function mergeFragmentWithExistingSelections(fragmentFieldSelection, existingSelections) {
|
|
13892
|
-
// Check if there is an existing selection for this field we can merge with
|
|
13893
|
-
// If this isn't done, we will see issues such as W-12293630 & W-12236456 as examples
|
|
13894
|
-
const existingField = getRequestedField(fragmentFieldSelection.name.value, existingSelections);
|
|
13895
|
-
if (existingField === undefined) {
|
|
13896
|
-
existingSelections.push(fragmentFieldSelection);
|
|
13897
|
-
}
|
|
13898
|
-
else {
|
|
13899
|
-
if (existingField.selectionSet === undefined) {
|
|
13900
|
-
existingField.selectionSet === fragmentFieldSelection.selectionSet;
|
|
13901
|
-
}
|
|
13902
|
-
else if (fragmentFieldSelection.selectionSet !== undefined) {
|
|
13903
|
-
existingField.selectionSet.selections = mergeSelections(fragmentFieldSelection.selectionSet.selections, existingField.selectionSet.selections);
|
|
13904
|
-
}
|
|
13905
|
-
}
|
|
13906
|
-
}
|
|
13907
|
-
function calculateRequestedFieldsForType(typename, selectionSet, namedFragmentsMap, isFragmentApplicable) {
|
|
13908
|
-
const selections = [];
|
|
13909
|
-
selectionSet.selections.forEach(selection => {
|
|
13910
|
-
if (selection.kind === "Field") {
|
|
13911
|
-
selections.push(selection);
|
|
13912
|
-
}
|
|
13913
|
-
if (selection.kind === "InlineFragment" && isFragmentApplicable(selection, typename)) {
|
|
13914
|
-
// loops over the map to get the values.
|
|
13915
|
-
getRequestedFieldsForType(typename, selection.selectionSet, namedFragmentsMap, isFragmentApplicable)
|
|
13916
|
-
.forEach(fragmentFieldSelection => { mergeFragmentWithExistingSelections(fragmentFieldSelection, selections); });
|
|
13917
|
-
}
|
|
13918
|
-
if (selection.kind === "FragmentSpread") {
|
|
13919
|
-
const namedFragment = namedFragmentsMap[selection.name.value];
|
|
13920
|
-
if (namedFragment && isFragmentApplicable(namedFragment, typename)) {
|
|
13921
|
-
// loops over the map to get the values.
|
|
13922
|
-
getRequestedFieldsForType(typename, namedFragment.selectionSet, namedFragmentsMap, isFragmentApplicable)
|
|
13923
|
-
.forEach(fragmentFieldSelection => { mergeFragmentWithExistingSelections(fragmentFieldSelection, selections); });
|
|
13924
|
-
}
|
|
13925
|
-
}
|
|
13926
|
-
});
|
|
13927
|
-
// Needs to happen after the selections are merged.
|
|
13928
|
-
return selections.reduce((acc, fieldNode) => {
|
|
13929
|
-
const fieldName = fieldNode.alias ? fieldNode.alias.value : fieldNode.name.value;
|
|
13930
|
-
// TODO: W-13485835. Some fields are not being merged, and this logic reproduces the current behavior in which the first field with name is being used.
|
|
13931
|
-
if (!acc.has(fieldName)) {
|
|
13932
|
-
acc.set(fieldName, fieldNode);
|
|
13933
|
-
}
|
|
13934
|
-
return acc;
|
|
13935
|
-
}, new Map());
|
|
13936
|
-
}
|
|
13937
|
-
let selectionSetRequestedFieldsWeakMap = new WeakMap();
|
|
13938
|
-
function getRequestedFieldsForType(typename, selectionSet, namedFragmentsMap, isFragmentApplicable) {
|
|
13939
|
-
let cachedRequestedFieldsConfigurations = selectionSetRequestedFieldsWeakMap.get(selectionSet);
|
|
13940
|
-
if (cachedRequestedFieldsConfigurations === undefined) {
|
|
13941
|
-
cachedRequestedFieldsConfigurations = new Map();
|
|
13942
|
-
selectionSetRequestedFieldsWeakMap.set(selectionSet, cachedRequestedFieldsConfigurations);
|
|
13943
|
-
}
|
|
13944
|
-
const cachedRequestedFieldsForType = cachedRequestedFieldsConfigurations.get(typename);
|
|
13945
|
-
if (cachedRequestedFieldsForType !== undefined) {
|
|
13946
|
-
return cachedRequestedFieldsForType;
|
|
13947
|
-
}
|
|
13948
|
-
const selections = calculateRequestedFieldsForType(typename, selectionSet, namedFragmentsMap, isFragmentApplicable);
|
|
13949
|
-
cachedRequestedFieldsConfigurations.set(typename, selections);
|
|
13950
|
-
return selections;
|
|
13951
|
-
}
|
|
13952
13851
|
function getQueryTransformerForType(typename, fragmentMap) {
|
|
13953
13852
|
switch (typename) {
|
|
13954
13853
|
case "PercentAggregate": return {
|
|
@@ -14567,18 +14466,7 @@ function selectCalculateSink(sink, field, buildSelectionForNodeFn, source, reade
|
|
|
14567
14466
|
(_a = field.selectionSet) === null || _a === void 0 ? void 0 : _a.selections.forEach((sel) => {
|
|
14568
14467
|
const builtSelection = buildSelectionForNodeFn(source, reader, field, sel, variables, fragments, parentRecordId);
|
|
14569
14468
|
if (builtSelection !== undefined) {
|
|
14570
|
-
|
|
14571
|
-
Object.keys(builtSelection).forEach((key, value) => {
|
|
14572
|
-
// We only assign a field selection in the fragment if it doesn't already exist in sink
|
|
14573
|
-
// The non-fragment selection already got the merged selections in getRequestedFieldsForType
|
|
14574
|
-
if (sink[key] === undefined) {
|
|
14575
|
-
sink[key] = builtSelection[key];
|
|
14576
|
-
}
|
|
14577
|
-
});
|
|
14578
|
-
}
|
|
14579
|
-
else {
|
|
14580
|
-
Object.assign(sink, builtSelection);
|
|
14581
|
-
}
|
|
14469
|
+
deepMerge(sink, builtSelection);
|
|
14582
14470
|
}
|
|
14583
14471
|
});
|
|
14584
14472
|
return sink;
|
|
@@ -18233,4 +18121,4 @@ register({
|
|
|
18233
18121
|
});
|
|
18234
18122
|
|
|
18235
18123
|
export { configurationForGraphQLAdapters as configuration, graphql, factory$1 as graphqlAdapterFactory, graphqlBatch, graphqlBatch_imperative, graphql_imperative };
|
|
18236
|
-
// version: 1.
|
|
18124
|
+
// version: 1.229.0-dev1-5b6d3db67
|
package/sfdc/index.js
CHANGED
|
@@ -4965,7 +4965,7 @@ function fulfill(existing, incoming) {
|
|
|
4965
4965
|
const batchRequestWithSingleRequest = isSingleBatchRecordRequest(existingUrlParams) &&
|
|
4966
4966
|
isSingleRecordRequest(urlParams) &&
|
|
4967
4967
|
incomingUrlRecords[0] === existingUrlRecords[0];
|
|
4968
|
-
if (!batchRequestWithSingleRequest) {
|
|
4968
|
+
if (!batchRequestWithSingleRequest || isRestrictedPathCondition(existingPath, path)) {
|
|
4969
4969
|
return false;
|
|
4970
4970
|
}
|
|
4971
4971
|
}
|
|
@@ -5008,6 +5008,12 @@ function isSingleBatchRecordRequest(urlParams) {
|
|
|
5008
5008
|
function isSingleRecordRequest(urlParams) {
|
|
5009
5009
|
return hasOwnProperty.call(urlParams, 'recordId');
|
|
5010
5010
|
}
|
|
5011
|
+
function isRestrictedPathCondition(existingPath, path) {
|
|
5012
|
+
// should not dedupe getRecordUi and getRecord as both of their representation is different
|
|
5013
|
+
// records call cannot digest response of getRecordUi
|
|
5014
|
+
return ((existingPath.includes('/record-ui') && path.includes('/records')) ||
|
|
5015
|
+
(existingPath.includes('/records') && path.includes('/record-ui')));
|
|
5016
|
+
}
|
|
5011
5017
|
|
|
5012
5018
|
const createResourceRequest$12 = function getUiApiRecordsByRecordIdCreateResourceRequest(config) {
|
|
5013
5019
|
return {
|
|
@@ -32847,4 +32853,4 @@ withDefaultLuvio((luvio) => {
|
|
|
32847
32853
|
});
|
|
32848
32854
|
|
|
32849
32855
|
export { InMemoryRecordRepresentationQueryEvaluator, MRU, RepresentationType$J as ObjectInfoRepresentationType, RepresentationType$O as RecordRepresentationRepresentationType, TTL$w as RecordRepresentationTTL, RepresentationType$O as RecordRepresentationType, VERSION$17 as RecordRepresentationVersion, keyPrefix as UiApiNamespace, configurationForRestAdapters as configuration, createContentDocumentAndVersion, createContentVersion, createIngestRecordWithFields, createRecord, deleteRecord, getActionOverrides, getActionOverrides_imperative, getAllApps, getAllApps_imperative, getAppDetails, getAppDetails_imperative, getDuplicateConfiguration, getDuplicateConfiguration_imperative, getDuplicates, getDuplicates_imperative, getGlobalActions, getGlobalActions_imperative, getKeywordSearchResults, getKeywordSearchResults_imperative, getLayout, getLayoutUserState, getLayoutUserState_imperative, getLayout_imperative, getListInfoByName, getListInfoByName_imperative, getListInfosByName, getListInfosByName_imperative, getListObjectInfo, getListObjectInfo_imperative, getListRecordsByName, getListRecordsByName_imperative, getListUi, getListUi_imperative, getLookupActions, getLookupActions_imperative, getLookupMetadata, getLookupMetadata_imperative, getLookupRecords, getLookupRecords_imperative, getNavItems, getNavItems_imperative, getObjectCreateActions, getObjectCreateActions_imperative, getObjectInfo, getObjectInfoAdapterFactory, getObjectInfo_imperative, getObjectInfos, getObjectInfosAdapterFactory, getObjectInfos_imperative, getPicklistValues, getPicklistValuesByRecordType, getPicklistValuesByRecordType_imperative, getPicklistValues_imperative, getQuickActionDefaults, getQuickActionDefaults_imperative, getQuickActionLayout, getQuickActionLayout_imperative, getRecord, getRecordActions, getRecordActions_imperative, factory$e as getRecordAdapterFactory, getRecordAvatars, getRecordAvatars_imperative, getRecordCreateDefaults, getRecordCreateDefaults_imperative, getRecordEditActions, getRecordEditActions_imperative, getRecordId18, getRecordNotifyChange, getRecordTemplateClone, getRecordTemplateClone_imperative, getRecordTemplateCreate, getRecordTemplateCreate_imperative, getRecordUi, getRecordUi_imperative, getRecord_imperative, getRecords, getRecordsAdapterFactory, getRecords_imperative, getRelatedListActions, getRelatedListActions_imperative, getRelatedListCount, getRelatedListCount_imperative, getRelatedListInfo, getRelatedListInfoBatch, getRelatedListInfoBatch_imperative, getRelatedListInfo_imperative, getRelatedListPreferences, getRelatedListPreferencesBatch, getRelatedListPreferencesBatch_imperative, getRelatedListPreferences_imperative, getRelatedListRecordActions, getRelatedListRecordActions_imperative, getRelatedListRecords, getRelatedListRecordsBatch, getRelatedListRecordsBatch_imperative, getRelatedListRecords_imperative, getRelatedListsActions, getRelatedListsActions_imperative, getRelatedListsCount, getRelatedListsCount_imperative, getRelatedListsInfo, getRelatedListsInfo_imperative, getResponseCacheKeys as getResponseCacheKeysContentDocumentCompositeRepresentation, getSearchFilterMetadata, getSearchFilterMetadata_imperative, getSearchFilterOptions, getSearchFilterOptions_imperative, getSearchResults, getSearchResults_imperative, getTypeCacheKeys$Q as getTypeCacheKeysRecord, ingest as ingestContentDocumentCompositeRepresentation, ingest$C as ingestObjectInfo, ingest$y as ingestQuickActionExecutionRepresentation, ingest$H as ingestRecord, instrument, keyBuilder as keyBuilderContentDocumentCompositeRepresentation, keyBuilderFromType as keyBuilderFromTypeContentDocumentCompositeRepresentation, keyBuilderFromType$y as keyBuilderFromTypeRecordRepresentation, keyBuilder$1J as keyBuilderObjectInfo, keyBuilder$1D as keyBuilderQuickActionExecutionRepresentation, keyBuilder$1U as keyBuilderRecord, notifyListInfoUpdateAvailable, notifyListViewSummaryUpdateAvailable, notifyQuickActionDefaultsUpdateAvailable, notifyRecordUpdateAvailable, performQuickAction, performUpdateRecordQuickAction, refresh, updateLayoutUserState, updateListInfoByName, updateRecord, updateRecordAvatar, updateRelatedListInfo, updateRelatedListPreferences };
|
|
32850
|
-
// version: 1.
|
|
32856
|
+
// version: 1.229.0-dev1-5b6d3db67
|
|
@@ -95,7 +95,7 @@ var TypeCheckShapes;
|
|
|
95
95
|
TypeCheckShapes[TypeCheckShapes["Integer"] = 3] = "Integer";
|
|
96
96
|
TypeCheckShapes[TypeCheckShapes["Unsupported"] = 4] = "Unsupported";
|
|
97
97
|
})(TypeCheckShapes || (TypeCheckShapes = {}));
|
|
98
|
-
// engine version: 0.145.
|
|
98
|
+
// engine version: 0.145.2-6a13677c
|
|
99
99
|
|
|
100
100
|
const { keys: ObjectKeys, create: ObjectCreate } = Object;
|
|
101
101
|
|