@@ -70,137 +70,132 @@ export class ComponentSetBuilder {
70
70
* @param options: options for creating a ComponentSet
71
71
*/
72
72
73
- // eslint-disable-next-line complexity
74
73
public static async build ( options : ComponentSetOptions ) : Promise < ComponentSet > {
75
74
const logger = Logger . childFromRoot ( 'componentSetBuilder' ) ;
76
75
let componentSet : ComponentSet | undefined ;
77
76
78
- const { sourcepath, manifest, metadata, packagenames, apiversion, sourceapiversion, org, projectDir } = options ;
79
- const registryAccess = new RegistryAccess ( undefined , projectDir ) ;
80
-
81
- try {
82
- if ( sourcepath ) {
83
- logger . debug ( `Building ComponentSet from sourcepath: ${ sourcepath . join ( ', ' ) } ` ) ;
84
- const fsPaths = sourcepath . map ( validateAndResolvePath ) ;
85
- componentSet = ComponentSet . fromSource ( {
86
- fsPaths,
87
- registry : registryAccess ,
88
- } ) ;
89
- }
77
+ const { sourcepath, manifest, metadata, packagenames, org } = options ;
78
+ const registry = new RegistryAccess ( undefined , options . projectDir ) ;
90
79
91
- // Return empty ComponentSet and use packageNames in the connection via `.retrieve` options
92
- if ( packagenames ) {
93
- logger . debug ( `Building ComponentSet for packagenames: ${ packagenames . toString ( ) } ` ) ;
94
- componentSet ??= new ComponentSet ( undefined , registryAccess ) ;
95
- }
80
+ if ( sourcepath ) {
81
+ logger . debug ( `Building ComponentSet from sourcepath: ${ sourcepath . join ( ', ' ) } ` ) ;
82
+ const fsPaths = sourcepath . map ( validateAndResolvePath ) ;
83
+ componentSet = ComponentSet . fromSource ( {
84
+ fsPaths,
85
+ registry,
86
+ } ) ;
87
+ }
96
88
97
- // Resolve manifest with source in package directories.
98
- if ( manifest ) {
99
- logger . debug ( `Building ComponentSet from manifest: ${ manifest . manifestPath } ` ) ;
100
- assertFileExists ( manifest . manifestPath ) ;
101
-
102
- logger . debug ( `Searching in packageDir: ${ manifest . directoryPaths . join ( ', ' ) } for matching metadata` ) ;
103
- componentSet = await ComponentSet . fromManifest ( {
104
- manifestPath : manifest . manifestPath ,
105
- resolveSourcePaths : manifest . directoryPaths ,
106
- forceAddWildcards : true ,
107
- destructivePre : manifest . destructiveChangesPre ,
108
- destructivePost : manifest . destructiveChangesPost ,
109
- registry : registryAccess ,
110
- } ) ;
111
- }
89
+ // Return empty ComponentSet and use packageNames in the connection via `.retrieve` options
90
+ if ( packagenames ) {
91
+ logger . debug ( `Building ComponentSet for packagenames: ${ packagenames . toString ( ) } ` ) ;
92
+ componentSet ??= new ComponentSet ( undefined , registry ) ;
93
+ }
112
94
113
- // Resolve metadata entries with source in package directories.
114
- if ( metadata ) {
115
- logger . debug ( `Building ComponentSet from metadata: ${ metadata . metadataEntries . toString ( ) } ` ) ;
116
- const directoryPaths = metadata . directoryPaths ;
117
- componentSet ??= new ComponentSet ( undefined , registryAccess ) ;
118
- const componentSetFilter = new ComponentSet ( undefined , registryAccess ) ;
119
-
120
- // Build a Set of metadata entries
121
- metadata . metadataEntries
122
- . map ( entryToTypeAndName ( registryAccess ) )
123
- . flatMap ( typeAndNameToMetadataComponents ( { directoryPaths, registry : registryAccess } ) )
124
- . map ( addToComponentSet ( componentSet ) )
125
- . map ( addToComponentSet ( componentSetFilter ) ) ;
126
-
127
- logger . debug ( `Searching for matching metadata in directories: ${ directoryPaths . join ( ', ' ) } ` ) ;
128
-
129
- // add destructive changes if defined. Because these are deletes, all entries
130
- // are resolved to SourceComponents
131
- if ( metadata . destructiveEntriesPre ) {
132
- metadata . destructiveEntriesPre
133
- . map ( entryToTypeAndName ( registryAccess ) )
134
- . map ( assertNoWildcardInDestructiveEntries )
135
- . flatMap ( typeAndNameToMetadataComponents ( { directoryPaths, registry : registryAccess } ) )
136
- . map ( ( mdComponent ) => new SourceComponent ( { type : mdComponent . type , name : mdComponent . fullName } ) )
137
- . map ( addToComponentSet ( componentSet , DestructiveChangesType . PRE ) ) ;
138
- }
139
- if ( metadata . destructiveEntriesPost ) {
140
- metadata . destructiveEntriesPost
141
- . map ( entryToTypeAndName ( registryAccess ) )
142
- . map ( assertNoWildcardInDestructiveEntries )
143
- . flatMap ( typeAndNameToMetadataComponents ( { directoryPaths, registry : registryAccess } ) )
144
- . map ( ( mdComponent ) => new SourceComponent ( { type : mdComponent . type , name : mdComponent . fullName } ) )
145
- . map ( addToComponentSet ( componentSet , DestructiveChangesType . POST ) ) ;
146
- }
95
+ // Resolve manifest with source in package directories.
96
+ if ( manifest ) {
97
+ logger . debug ( `Building ComponentSet from manifest: ${ manifest . manifestPath } ` ) ;
98
+ assertFileExists ( manifest . manifestPath ) ;
99
+
100
+ logger . debug ( `Searching in packageDir: ${ manifest . directoryPaths . join ( ', ' ) } for matching metadata` ) ;
101
+ componentSet = await ComponentSet . fromManifest ( {
102
+ manifestPath : manifest . manifestPath ,
103
+ resolveSourcePaths : manifest . directoryPaths ,
104
+ forceAddWildcards : true ,
105
+ destructivePre : manifest . destructiveChangesPre ,
106
+ destructivePost : manifest . destructiveChangesPost ,
107
+ registry,
108
+ } ) ;
109
+ }
147
110
148
- const resolvedComponents = ComponentSet . fromSource ( {
149
- fsPaths : directoryPaths ,
150
- include : componentSetFilter ,
151
- registry : registryAccess ,
152
- } ) ;
153
-
154
- if ( resolvedComponents . forceIgnoredPaths ) {
155
- // if useFsForceIgnore = true, then we won't be able to resolve a forceignored path,
156
- // which we need to do to get the ignored source component
157
- const resolver = new MetadataResolver ( registryAccess , undefined , false ) ;
158
-
159
- for ( const ignoredPath of resolvedComponents . forceIgnoredPaths ?? [ ] ) {
160
- resolver . getComponentsFromPath ( ignoredPath ) . map ( ( ignored ) => {
161
- componentSet = componentSet ?. filter (
162
- ( resolved ) => ! ( resolved . fullName === ignored . name && resolved . type === ignored . type )
163
- ) ;
164
- } ) ;
165
- }
166
- componentSet . forceIgnoredPaths = resolvedComponents . forceIgnoredPaths ;
167
- }
111
+ // Resolve metadata entries with source in package directories.
112
+ if ( metadata ) {
113
+ logger . debug ( `Building ComponentSet from metadata: ${ metadata . metadataEntries . toString ( ) } ` ) ;
114
+ const directoryPaths = metadata . directoryPaths ;
115
+ componentSet ??= new ComponentSet ( undefined , registry ) ;
116
+ const componentSetFilter = new ComponentSet ( undefined , registry ) ;
117
+
118
+ // Build a Set of metadata entries
119
+ metadata . metadataEntries
120
+ . map ( entryToTypeAndName ( registry ) )
121
+ . flatMap ( typeAndNameToMetadataComponents ( { directoryPaths, registry } ) )
122
+ . map ( addToComponentSet ( componentSet ) )
123
+ . map ( addToComponentSet ( componentSetFilter ) ) ;
124
+
125
+ logger . debug ( `Searching for matching metadata in directories: ${ directoryPaths . join ( ', ' ) } ` ) ;
126
+
127
+ // add destructive changes if defined. Because these are deletes, all entries
128
+ // are resolved to SourceComponents
129
+ if ( metadata . destructiveEntriesPre ) {
130
+ metadata . destructiveEntriesPre
131
+ . map ( entryToTypeAndName ( registry ) )
132
+ . map ( assertNoWildcardInDestructiveEntries )
133
+ . flatMap ( typeAndNameToMetadataComponents ( { directoryPaths, registry } ) )
134
+ . map ( ( mdComponent ) => new SourceComponent ( { type : mdComponent . type , name : mdComponent . fullName } ) )
135
+ . map ( addToComponentSet ( componentSet , DestructiveChangesType . PRE ) ) ;
136
+ }
137
+ if ( metadata . destructiveEntriesPost ) {
138
+ metadata . destructiveEntriesPost
139
+ . map ( entryToTypeAndName ( registry ) )
140
+ . map ( assertNoWildcardInDestructiveEntries )
141
+ . flatMap ( typeAndNameToMetadataComponents ( { directoryPaths, registry } ) )
142
+ . map ( ( mdComponent ) => new SourceComponent ( { type : mdComponent . type , name : mdComponent . fullName } ) )
143
+ . map ( addToComponentSet ( componentSet , DestructiveChangesType . POST ) ) ;
144
+ }
168
145
169
- resolvedComponents . toArray ( ) . map ( addToComponentSet ( componentSet ) ) ;
146
+ const resolvedComponents = ComponentSet . fromSource ( {
147
+ fsPaths : directoryPaths ,
148
+ include : componentSetFilter ,
149
+ registry,
150
+ } ) ;
151
+
152
+ if ( resolvedComponents . forceIgnoredPaths ) {
153
+ // if useFsForceIgnore = true, then we won't be able to resolve a forceignored path,
154
+ // which we need to do to get the ignored source component
155
+ const resolver = new MetadataResolver ( registry , undefined , false ) ;
156
+
157
+ for ( const ignoredPath of resolvedComponents . forceIgnoredPaths ?? [ ] ) {
158
+ resolver . getComponentsFromPath ( ignoredPath ) . map ( ( ignored ) => {
159
+ componentSet = componentSet ?. filter (
160
+ ( resolved ) => ! ( resolved . fullName === ignored . name && resolved . type === ignored . type )
161
+ ) ;
162
+ } ) ;
163
+ }
164
+ componentSet . forceIgnoredPaths = resolvedComponents . forceIgnoredPaths ;
170
165
}
171
166
172
- // Resolve metadata entries with an org connection
173
- if ( org ) {
174
- componentSet ??= new ComponentSet ( undefined , registryAccess ) ;
167
+ resolvedComponents . toArray ( ) . map ( addToComponentSet ( componentSet ) ) ;
168
+ }
175
169
176
- logger . debug (
177
- `Building ComponentSet from targetUsername: ${ org . username } ${
178
- metadata ? `filtered by metadata: ${ metadata . metadataEntries . toString ( ) } ` : ''
179
- } `
180
- ) ;
170
+ // Resolve metadata entries with an org connection
171
+ if ( org ) {
172
+ componentSet ??= new ComponentSet ( undefined , registry ) ;
181
173
182
- const mdMap = metadata
183
- ? buildMapFromComponents ( metadata . metadataEntries . map ( entryToTypeAndName ( registryAccess ) ) )
184
- : ( new Map ( ) as MetadataMap ) ;
174
+ logger . debug (
175
+ `Building ComponentSet from targetUsername: ${ org . username } ${
176
+ metadata ? `filtered by metadata: ${ metadata . metadataEntries . toString ( ) } ` : ''
177
+ } `
178
+ ) ;
185
179
186
- const fromConnection = await ComponentSet . fromConnection ( {
187
- usernameOrConnection : ( await StateAggregator . getInstance ( ) ) . aliases . getUsername ( org . username ) ?? org . username ,
188
- componentFilter : getOrgComponentFilter ( org , mdMap , metadata ) ,
189
- metadataTypes : mdMap . size ? Array . from ( mdMap . keys ( ) ) : undefined ,
190
- registry : registryAccess ,
191
- } ) ;
180
+ const mdMap = metadata
181
+ ? buildMapFromComponents ( metadata . metadataEntries . map ( entryToTypeAndName ( registry ) ) )
182
+ : ( new Map ( ) as MetadataMap ) ;
192
183
193
- fromConnection . toArray ( ) . map ( addToComponentSet ( componentSet ) ) ;
194
- }
195
- } catch ( e ) {
196
- return componentSetBuilderErrorHandler ( e ) ;
184
+ const fromConnection = await ComponentSet . fromConnection ( {
185
+ usernameOrConnection : ( await StateAggregator . getInstance ( ) ) . aliases . getUsername ( org . username ) ?? org . username ,
186
+ componentFilter : getOrgComponentFilter ( org , mdMap , metadata ) ,
187
+ metadataTypes : mdMap . size ? Array . from ( mdMap . keys ( ) ) : undefined ,
188
+ registry,
189
+ } ) ;
190
+
191
+ fromConnection . toArray ( ) . map ( addToComponentSet ( componentSet ) ) ;
197
192
}
198
193
199
194
// there should have been a componentSet created by this point.
200
195
componentSet = assertComponentSetIsNotUndefined ( componentSet ) ;
201
- componentSet . apiVersion ??= apiversion ;
202
- componentSet . sourceApiVersion ??= sourceapiversion ;
203
- componentSet . projectDirectory = projectDir ;
196
+ componentSet . apiVersion ??= options . apiversion ;
197
+ componentSet . sourceApiVersion ??= options . sourceapiversion ;
198
+ componentSet . projectDirectory = options . projectDir ;
204
199
205
200
logComponents ( logger , componentSet ) ;
206
201
return componentSet ;
@@ -214,17 +209,6 @@ const addToComponentSet =
214
209
return cmp ;
215
210
} ;
216
211
217
- const componentSetBuilderErrorHandler = ( e : unknown ) : never => {
218
- if ( e instanceof Error && e . message . includes ( 'Missing metadata type definition in registry for id' ) ) {
219
- // to remain generic to catch missing metadata types regardless of parameters, split on '
220
- // example message : Missing metadata type definition in registry for id 'NonExistentType'
221
- const issueType = e . message . split ( "'" ) [ 1 ] ;
222
- throw new SfError ( `The specified metadata type is unsupported: [${ issueType } ]` ) ;
223
- } else {
224
- throw e ;
225
- }
226
- } ;
227
-
228
212
const validateAndResolvePath = ( filepath : string ) : string => path . resolve ( assertFileExists ( filepath ) ) ;
229
213
230
214
const assertFileExists = ( filepath : string ) : string => {
0 commit comments