@@ -14,7 +14,7 @@ import { SourceComponent } from '../resolve/sourceComponent';
14
14
import { ComponentSet } from '../collections/componentSet' ;
15
15
import { RegistryAccess } from '../registry/registryAccess' ;
16
16
import type { FileProperties } from '../client/types' ;
17
- import { MetadataType } from '../registry/types' ;
17
+ import type { MetadataType } from '../registry/types' ;
18
18
import { MetadataResolver } from '../resolve' ;
19
19
import { DestructiveChangesType , FromConnectionOptions } from './types' ;
20
20
@@ -91,15 +91,15 @@ export class ComponentSetBuilder {
91
91
*/
92
92
93
93
public static async build ( options : ComponentSetOptions ) : Promise < ComponentSet > {
94
- let componentSet : ComponentSet | undefined ;
95
-
96
94
const { sourcepath, manifest, metadata, packagenames, org } = options ;
97
95
const registry = new RegistryAccess ( undefined , options . projectDir ) ;
96
+ let componentSetToReturn = new ComponentSet ( undefined , registry ) ;
98
97
99
98
if ( sourcepath ) {
100
99
getLogger ( ) . debug ( `Building ComponentSet from sourcepath: ${ sourcepath . join ( ', ' ) } ` ) ;
101
100
const fsPaths = sourcepath . map ( validateAndResolvePath ) ;
102
- componentSet = ComponentSet . fromSource ( {
101
+ // first possible option, so we can just set it, next CSB options, must add to this componentSet
102
+ componentSetToReturn = ComponentSet . fromSource ( {
103
103
fsPaths,
104
104
registry,
105
105
} ) ;
@@ -108,38 +108,20 @@ export class ComponentSetBuilder {
108
108
// Return empty ComponentSet and use packageNames in the connection via `.retrieve` options
109
109
if ( packagenames ) {
110
110
getLogger ( ) . debug ( `Building ComponentSet for packagenames: ${ packagenames . toString ( ) } ` ) ;
111
- componentSet ??= new ComponentSet ( undefined , registry ) ;
112
111
}
113
112
114
- // Resolve manifest with source in package directories.
115
- if ( manifest ) {
116
- getLogger ( ) . debug ( `Building ComponentSet from manifest: ${ manifest . manifestPath } ` ) ;
117
- assertFileExists ( manifest . manifestPath ) ;
118
-
119
- getLogger ( ) . debug ( `Searching in packageDir: ${ manifest . directoryPaths . join ( ', ' ) } for matching metadata` ) ;
120
- componentSet = await ComponentSet . fromManifest ( {
121
- manifestPath : manifest . manifestPath ,
122
- resolveSourcePaths : manifest . directoryPaths ,
123
- forceAddWildcards : true ,
124
- destructivePre : manifest . destructiveChangesPre ,
125
- destructivePost : manifest . destructiveChangesPost ,
126
- registry,
127
- } ) ;
128
- }
129
-
130
- // Resolve metadata entries with source in package directories, unless we are building a ComponentSet
131
- // from metadata in an org.
132
- if ( metadata && ! org ) {
113
+ // Resolve metadata entries with source in package directories
114
+ if ( metadata ) {
133
115
getLogger ( ) . debug ( `Building ComponentSet from metadata: ${ metadata . metadataEntries . toString ( ) } ` ) ;
134
116
const directoryPaths = metadata . directoryPaths ;
135
- componentSet ??= new ComponentSet ( undefined , registry ) ;
136
117
const componentSetFilter = new ComponentSet ( undefined , registry ) ;
137
118
138
119
// Build a Set of metadata entries
139
120
metadata . metadataEntries
121
+ . filter ( filterPsuedoTypes )
140
122
. map ( entryToTypeAndName ( registry ) )
141
123
. flatMap ( typeAndNameToMetadataComponents ( { directoryPaths, registry } ) )
142
- . map ( addToComponentSet ( componentSet ) )
124
+ . map ( addToComponentSet ( componentSetToReturn ) )
143
125
. map ( addToComponentSet ( componentSetFilter ) ) ;
144
126
145
127
getLogger ( ) . debug ( `Searching for matching metadata in directories: ${ directoryPaths . join ( ', ' ) } ` ) ;
@@ -148,19 +130,21 @@ export class ComponentSetBuilder {
148
130
// are resolved to SourceComponents
149
131
if ( metadata . destructiveEntriesPre ) {
150
132
metadata . destructiveEntriesPre
133
+ . filter ( filterPsuedoTypes )
151
134
. map ( entryToTypeAndName ( registry ) )
152
135
. map ( assertNoWildcardInDestructiveEntries )
153
136
. flatMap ( typeAndNameToMetadataComponents ( { directoryPaths, registry } ) )
154
137
. map ( ( mdComponent ) => new SourceComponent ( { type : mdComponent . type , name : mdComponent . fullName } ) )
155
- . map ( addToComponentSet ( componentSet , DestructiveChangesType . PRE ) ) ;
138
+ . map ( addToComponentSet ( componentSetToReturn , DestructiveChangesType . PRE ) ) ;
156
139
}
157
140
if ( metadata . destructiveEntriesPost ) {
158
141
metadata . destructiveEntriesPost
142
+ . filter ( filterPsuedoTypes )
159
143
. map ( entryToTypeAndName ( registry ) )
160
144
. map ( assertNoWildcardInDestructiveEntries )
161
145
. flatMap ( typeAndNameToMetadataComponents ( { directoryPaths, registry } ) )
162
146
. map ( ( mdComponent ) => new SourceComponent ( { type : mdComponent . type , name : mdComponent . fullName } ) )
163
- . map ( addToComponentSet ( componentSet , DestructiveChangesType . POST ) ) ;
147
+ . map ( addToComponentSet ( componentSetToReturn , DestructiveChangesType . POST ) ) ;
164
148
}
165
149
166
150
const resolvedComponents = ComponentSet . fromSource ( {
@@ -169,39 +153,56 @@ export class ComponentSetBuilder {
169
153
registry,
170
154
} ) ;
171
155
172
- if ( resolvedComponents . forceIgnoredPaths ) {
156
+ if ( resolvedComponents ? .forceIgnoredPaths ) {
173
157
// if useFsForceIgnore = true, then we won't be able to resolve a forceignored path,
174
158
// which we need to do to get the ignored source component
175
159
const resolver = new MetadataResolver ( registry , undefined , false ) ;
176
160
177
161
for ( const ignoredPath of resolvedComponents . forceIgnoredPaths ?? [ ] ) {
178
162
resolver . getComponentsFromPath ( ignoredPath ) . map ( ( ignored ) => {
179
- componentSet = componentSet ?. filter (
163
+ componentSetToReturn = componentSetToReturn ?. filter (
180
164
( resolved ) => ! ( resolved . fullName === ignored . name && resolved . type === ignored . type )
181
165
) ;
182
166
} ) ;
183
167
}
184
- componentSet . forceIgnoredPaths = resolvedComponents . forceIgnoredPaths ;
168
+ componentSetToReturn . forceIgnoredPaths = resolvedComponents . forceIgnoredPaths ;
185
169
}
186
170
187
- resolvedComponents . toArray ( ) . map ( addToComponentSet ( componentSet ) ) ;
171
+ resolvedComponents ? .toArray ( ) . map ( addToComponentSet ( componentSetToReturn ) ) ;
188
172
}
189
173
190
174
// Resolve metadata entries with an org connection
191
175
if ( org ) {
192
- componentSet ??= new ComponentSet ( undefined , registry ) ;
193
176
const orgComponentSet = await this . resolveOrgComponents ( registry , options ) ;
194
- orgComponentSet . toArray ( ) . map ( addToComponentSet ( componentSet ) ) ;
177
+ orgComponentSet . toArray ( ) . map ( addToComponentSet ( componentSetToReturn ) ) ;
178
+ }
179
+
180
+ // Resolve manifest with source in package directories.
181
+ // build from the manifest last, because if this value is passed with other ones, it will override the componentSetToReturn CS
182
+ if ( manifest ) {
183
+ getLogger ( ) . debug ( `Building ComponentSet from manifest: ${ manifest . manifestPath } ` ) ;
184
+ assertFileExists ( manifest . manifestPath ) ;
185
+
186
+ getLogger ( ) . debug ( `Searching in packageDir: ${ manifest . directoryPaths . join ( ', ' ) } for matching metadata` ) ;
187
+ // set here (using =) because generating a CS by using manifest + other options, is not supported
188
+ componentSetToReturn = await ComponentSet . fromManifest ( {
189
+ manifestPath : manifest . manifestPath ,
190
+ resolveSourcePaths : manifest . directoryPaths ,
191
+ forceAddWildcards : true ,
192
+ destructivePre : manifest . destructiveChangesPre ,
193
+ destructivePost : manifest . destructiveChangesPost ,
194
+ registry,
195
+ } ) ;
195
196
}
196
197
197
198
// there should have been a componentSet created by this point.
198
- componentSet = assertComponentSetIsNotUndefined ( componentSet ) ;
199
- componentSet . apiVersion ??= options . apiversion ;
200
- componentSet . sourceApiVersion ??= options . sourceapiversion ;
201
- componentSet . projectDirectory = options . projectDir ;
199
+ componentSetToReturn = assertComponentSetIsNotUndefined ( componentSetToReturn ) ;
200
+ componentSetToReturn . apiVersion ??= options . apiversion ;
201
+ componentSetToReturn . sourceApiVersion ??= options . sourceapiversion ;
202
+ componentSetToReturn . projectDirectory = options . projectDir ;
202
203
203
- logComponents ( componentSet ) ;
204
- return componentSet ;
204
+ logComponents ( componentSetToReturn ) ;
205
+ return componentSetToReturn ;
205
206
}
206
207
207
208
private static async resolveOrgComponents (
@@ -331,6 +332,13 @@ export const entryToTypeAndName =
331
332
return { type, metadataName : name . length ? name . join ( ':' ) . trim ( ) : '*' } ;
332
333
} ;
333
334
335
+ const filterPsuedoTypes = ( value : string ) : boolean => {
336
+ const [ typeName ] = value . split ( ':' ) ;
337
+ return ! Object . values ( PSEUDO_TYPES )
338
+ . map ( ( p ) => p . toLowerCase ( ) )
339
+ . includes ( typeName . toLowerCase ( ) ) ;
340
+ } ;
341
+
334
342
const typeAndNameToMetadataComponents =
335
343
( context : { directoryPaths : ManifestOption [ 'directoryPaths' ] ; registry : RegistryAccess } ) =>
336
344
( { type, metadataName } : MetadataTypeAndMetadataName ) : MetadataComponent [ ] =>
0 commit comments