Skip to content

Commit 164cca6

Browse files
committed
feat: pass in registry
1 parent b50976c commit 164cca6

7 files changed

+220
-172
lines changed

src/shared/conflicts.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
66
*/
77
import { resolve } from 'node:path';
8-
import { ComponentSet, ForceIgnore } from '@salesforce/source-deploy-retrieve';
8+
import { ComponentSet, ForceIgnore, RegistryAccess } from '@salesforce/source-deploy-retrieve';
99
import { ConflictResponse, ChangeResult, SourceConflictError } from './types';
1010
import { getMetadataKey } from './functions';
1111
import { populateTypesAndNames } from './populateTypesAndNames';
@@ -48,11 +48,13 @@ export const getDedupedConflictsFromChanges = ({
4848
remoteChanges = [],
4949
projectPath,
5050
forceIgnore,
51+
registry,
5152
}: {
5253
localChanges: ChangeResult[];
5354
remoteChanges: ChangeResult[];
5455
projectPath: string;
5556
forceIgnore: ForceIgnore;
57+
registry: RegistryAccess;
5658
}): ChangeResult[] => {
5759
const metadataKeyIndex = new Map(
5860
remoteChanges
@@ -65,7 +67,7 @@ export const getDedupedConflictsFromChanges = ({
6567

6668
const conflicts = new Set<ChangeResult>();
6769

68-
populateTypesAndNames({ elements: localChanges, excludeUnresolvable: true, projectPath, forceIgnore })
70+
populateTypesAndNames({ excludeUnresolvable: true, projectPath, forceIgnore, registry })(localChanges)
6971
.filter(isChangeResultWithNameAndType)
7072
.map((change) => {
7173
const metadataKey = getMetadataKey(change.name, change.type);

src/shared/localComponentSetArray.ts

+13-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
MetadataResolver,
1313
VirtualTreeContainer,
1414
DestructiveChangesType,
15+
RegistryAccess,
1516
} from '@salesforce/source-deploy-retrieve';
1617
import { sourceComponentGuard } from './guards';
1718
import { supportsPartialDelete, pathIsInFolder } from './functions';
@@ -51,26 +52,34 @@ const getNonSequential = ({
5152
},
5253
];
5354

54-
export const getComponentSets = (groupings: GroupedFile[], sourceApiVersion?: string): ComponentSet[] => {
55+
export const getComponentSets = ({
56+
groupings,
57+
sourceApiVersion,
58+
registry = new RegistryAccess(),
59+
}: {
60+
groupings: GroupedFile[];
61+
sourceApiVersion?: string;
62+
registry: RegistryAccess;
63+
}): ComponentSet[] => {
5564
const logger = Logger.childFromRoot('localComponentSetArray');
5665

5766
// optimistic resolution...some files may not be possible to resolve
58-
const resolverForNonDeletes = new MetadataResolver();
67+
const resolverForNonDeletes = new MetadataResolver(registry);
5968

6069
return groupings
6170
.map((grouping) => {
6271
logger.debug(
6372
`building componentSet for ${grouping.path} (deletes: ${grouping.deletes.length} nonDeletes: ${grouping.nonDeletes.length})`
6473
);
6574

66-
const componentSet = new ComponentSet();
75+
const componentSet = new ComponentSet(undefined, registry);
6776
if (sourceApiVersion) {
6877
componentSet.sourceApiVersion = sourceApiVersion;
6978
}
7079

7180
// we need virtual components for the deletes.
7281
// TODO: could we use the same for the non-deletes?
73-
const resolverForDeletes = new MetadataResolver(undefined, VirtualTreeContainer.fromFilePaths(grouping.deletes));
82+
const resolverForDeletes = new MetadataResolver(registry, VirtualTreeContainer.fromFilePaths(grouping.deletes));
7483

7584
grouping.deletes
7685
.flatMap((filename) => resolverForDeletes.getComponentsFromPath(filename))

src/shared/populateFilePaths.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
import { EOL } from 'node:os';
88
import { Logger } from '@salesforce/core';
9-
import { ComponentSet } from '@salesforce/source-deploy-retrieve';
9+
import { ComponentSet, RegistryAccess } from '@salesforce/source-deploy-retrieve';
1010
import { ChangeResult } from './types';
1111
import { isChangeResultWithNameAndType } from './guards';
1212
import {
@@ -24,7 +24,15 @@ import {
2424
* @param packageDirPaths Array of paths from PackageDirectories
2525
* @returns
2626
*/
27-
export const populateFilePaths = (elements: ChangeResult[], packageDirPaths: string[]): ChangeResult[] => {
27+
export const populateFilePaths = ({
28+
elements,
29+
packageDirPaths,
30+
registry,
31+
}: {
32+
elements: ChangeResult[];
33+
packageDirPaths: string[];
34+
registry: RegistryAccess;
35+
}): ChangeResult[] => {
2836
if (elements.length === 0) {
2937
return [];
3038
}
@@ -36,7 +44,7 @@ export const populateFilePaths = (elements: ChangeResult[], packageDirPaths: str
3644
.filter(isChangeResultWithNameAndType)
3745
.map(remoteChangeToMetadataMember);
3846

39-
const remoteChangesAsComponentSet = new ComponentSet(remoteChangesAsMetadataMember);
47+
const remoteChangesAsComponentSet = new ComponentSet(remoteChangesAsMetadataMember, registry);
4048

4149
logger.debug(` the generated component set has ${remoteChangesAsComponentSet.size.toString()} items`);
4250
if (remoteChangesAsComponentSet.size < elements.length) {

src/shared/populateTypesAndNames.ts

+69-60
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@
66
*/
77
import { Logger } from '@salesforce/core';
88
import { isString } from '@salesforce/ts-types';
9-
import { MetadataResolver, VirtualTreeContainer, ForceIgnore } from '@salesforce/source-deploy-retrieve';
9+
import {
10+
MetadataResolver,
11+
VirtualTreeContainer,
12+
ForceIgnore,
13+
RegistryAccess,
14+
} from '@salesforce/source-deploy-retrieve';
1015
import { ChangeResult } from './types';
1116
import { isChangeResultWithNameAndType, sourceComponentGuard } from './guards';
1217
import {
@@ -26,67 +31,71 @@ import {
2631
* @input excludeUnresolvable: boolean Filter out components where you can't get the name and type (that is, it's probably not a valid source component)
2732
* @input resolveDeleted: constructs a virtualTree instead of the actual filesystem--useful when the files no longer exist
2833
*/
29-
export const populateTypesAndNames = ({
30-
elements,
31-
projectPath,
32-
forceIgnore,
33-
excludeUnresolvable = false,
34-
resolveDeleted = false,
35-
}: {
36-
elements: ChangeResult[];
37-
projectPath: string;
38-
forceIgnore?: ForceIgnore;
39-
excludeUnresolvable?: boolean;
40-
resolveDeleted?: boolean;
41-
}): ChangeResult[] => {
42-
if (elements.length === 0) {
43-
return [];
44-
}
45-
const logger = Logger.childFromRoot('SourceTracking.PopulateTypesAndNames');
46-
logger.debug(`populateTypesAndNames for ${elements.length} change elements`);
47-
const filenames = elements.flatMap((element) => element.filenames).filter(isString);
34+
export const populateTypesAndNames =
35+
({
36+
projectPath,
37+
forceIgnore,
38+
excludeUnresolvable = false,
39+
resolveDeleted = false,
40+
registry,
41+
}: {
42+
projectPath: string;
43+
forceIgnore?: ForceIgnore;
44+
excludeUnresolvable?: boolean;
45+
resolveDeleted?: boolean;
46+
registry: RegistryAccess;
47+
}) =>
48+
(elements: ChangeResult[]): ChangeResult[] => {
49+
if (elements.length === 0) {
50+
return [];
51+
}
52+
const logger = Logger.childFromRoot('SourceTracking.PopulateTypesAndNames');
53+
logger.debug(`populateTypesAndNames for ${elements.length} change elements`);
54+
const filenames = elements.flatMap((element) => element.filenames).filter(isString);
4855

49-
// component set generated from the filenames on all local changes
50-
const resolver = new MetadataResolver(
51-
undefined,
52-
resolveDeleted ? VirtualTreeContainer.fromFilePaths(filenames) : undefined,
53-
!!forceIgnore
54-
);
55-
const sourceComponents = filenames
56-
.flatMap((filename) => {
57-
try {
58-
return resolver.getComponentsFromPath(filename);
59-
} catch (e) {
60-
logger.warn(`unable to resolve ${filename}`);
61-
return undefined;
62-
}
63-
})
64-
.filter(sourceComponentGuard);
56+
// component set generated from the filenames on all local changes
57+
const resolver = new MetadataResolver(
58+
registry,
59+
resolveDeleted ? VirtualTreeContainer.fromFilePaths(filenames) : undefined,
60+
!!forceIgnore
61+
);
62+
const sourceComponents = filenames
63+
.flatMap((filename) => {
64+
try {
65+
return resolver.getComponentsFromPath(filename);
66+
} catch (e) {
67+
logger.warn(`unable to resolve ${filename}`);
68+
return undefined;
69+
}
70+
})
71+
.filter(sourceComponentGuard);
6572

66-
logger.debug(` matching SourceComponents have ${sourceComponents.length} items from local`);
73+
logger.debug(` matching SourceComponents have ${sourceComponents.length} items from local`);
6774

68-
const elementMap = new Map(
69-
elements.flatMap((e) => (e.filenames ?? []).map((f) => [ensureRelative(projectPath)(f), e]))
70-
);
75+
const elementMap = new Map(
76+
elements.flatMap((e) => (e.filenames ?? []).map((f) => [ensureRelative(projectPath)(f), e]))
77+
);
7178

72-
// iterates the local components and sets their filenames
73-
sourceComponents.filter(sourceComponentHasFullNameAndType).map((matchingComponent) => {
74-
const filenamesFromMatchingComponent = getAllFiles(matchingComponent);
75-
const ignored = filenamesFromMatchingComponent.filter(excludeLwcLocalOnlyTest).some(forceIgnoreDenies(forceIgnore));
76-
filenamesFromMatchingComponent.map((filename) => {
77-
if (filename && elementMap.has(filename)) {
78-
// add the type/name from the componentSet onto the element
79-
elementMap.set(filename, {
80-
origin: 'remote',
81-
...elementMap.get(filename),
82-
type: matchingComponent.type.name,
83-
name: matchingComponent.fullName,
84-
ignored,
85-
});
86-
}
79+
// iterates the local components and sets their filenames
80+
sourceComponents.filter(sourceComponentHasFullNameAndType).map((matchingComponent) => {
81+
const filenamesFromMatchingComponent = getAllFiles(matchingComponent);
82+
const ignored = filenamesFromMatchingComponent
83+
.filter(excludeLwcLocalOnlyTest)
84+
.some(forceIgnoreDenies(forceIgnore));
85+
filenamesFromMatchingComponent.map((filename) => {
86+
if (filename && elementMap.has(filename)) {
87+
// add the type/name from the componentSet onto the element
88+
elementMap.set(filename, {
89+
origin: 'remote',
90+
...elementMap.get(filename),
91+
type: matchingComponent.type.name,
92+
name: matchingComponent.fullName,
93+
ignored,
94+
});
95+
}
96+
});
8797
});
88-
});
89-
return excludeUnresolvable
90-
? Array.from(new Set(elementMap.values())).filter(isChangeResultWithNameAndType)
91-
: Array.from(new Set(elementMap.values()));
92-
};
98+
return excludeUnresolvable
99+
? Array.from(new Set(elementMap.values())).filter(isChangeResultWithNameAndType)
100+
: Array.from(new Set(elementMap.values()));
101+
};

0 commit comments

Comments
 (0)