@@ -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,7 +108,6 @@ 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
113
// Resolve manifest with source in package directories.
@@ -117,29 +116,47 @@ export class ComponentSetBuilder {
117
116
assertFileExists ( manifest . manifestPath ) ;
118
117
119
118
getLogger ( ) . debug ( `Searching in packageDir: ${ manifest . directoryPaths . join ( ', ' ) } for matching metadata` ) ;
120
- componentSet = await ComponentSet . fromManifest ( {
119
+ const constructiveCS = await ComponentSet . fromManifest ( {
121
120
manifestPath : manifest . manifestPath ,
122
121
resolveSourcePaths : manifest . directoryPaths ,
123
122
forceAddWildcards : true ,
124
- destructivePre : manifest . destructiveChangesPre ,
125
- destructivePost : manifest . destructiveChangesPost ,
126
123
registry,
127
124
} ) ;
125
+ constructiveCS . toArray ( ) . map ( addToComponentSet ( componentSetToReturn ) ) ;
126
+
127
+ if ( manifest . destructiveChangesPre ) {
128
+ // build this up as if it were constructive, to satisfy fromManifest parameter types
129
+ const destructivePre = await ComponentSet . fromManifest ( {
130
+ resolveSourcePaths : manifest . directoryPaths ,
131
+ manifestPath : manifest . destructiveChangesPre ,
132
+ registry,
133
+ } ) ;
134
+ destructivePre . toArray ( ) . map ( addToComponentSet ( componentSetToReturn , DestructiveChangesType . PRE ) ) ;
135
+ }
136
+
137
+ if ( manifest . destructiveChangesPost ) {
138
+ const destrutivePost = await ComponentSet . fromManifest ( {
139
+ manifestPath : manifest . destructiveChangesPost ,
140
+ resolveSourcePaths : manifest . directoryPaths ,
141
+ registry,
142
+ } ) ;
143
+ destrutivePost . toArray ( ) . map ( addToComponentSet ( componentSetToReturn , DestructiveChangesType . POST ) ) ;
144
+ }
145
+ componentSetToReturn . sourceApiVersion ??= constructiveCS . sourceApiVersion ;
146
+ componentSetToReturn . apiVersion ??= constructiveCS . apiVersion ;
128
147
}
129
148
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 ) {
149
+ // Resolve metadata entries with source in package directories
150
+ if ( metadata ) {
133
151
getLogger ( ) . debug ( `Building ComponentSet from metadata: ${ metadata . metadataEntries . toString ( ) } ` ) ;
134
152
const directoryPaths = metadata . directoryPaths ;
135
- componentSet ??= new ComponentSet ( undefined , registry ) ;
136
153
const componentSetFilter = new ComponentSet ( undefined , registry ) ;
137
154
138
155
// Build a Set of metadata entries
139
- metadata . metadataEntries
140
- . map ( entryToTypeAndName ( registry ) )
156
+ const l = metadata . metadataEntries . filter ( filterPsuedoTypes ) ;
157
+ l . map ( entryToTypeAndName ( registry ) )
141
158
. flatMap ( typeAndNameToMetadataComponents ( { directoryPaths, registry } ) )
142
- . map ( addToComponentSet ( componentSet ) )
159
+ . map ( addToComponentSet ( componentSetToReturn ) )
143
160
. map ( addToComponentSet ( componentSetFilter ) ) ;
144
161
145
162
getLogger ( ) . debug ( `Searching for matching metadata in directories: ${ directoryPaths . join ( ', ' ) } ` ) ;
@@ -148,19 +165,21 @@ export class ComponentSetBuilder {
148
165
// are resolved to SourceComponents
149
166
if ( metadata . destructiveEntriesPre ) {
150
167
metadata . destructiveEntriesPre
168
+ . filter ( filterPsuedoTypes )
151
169
. map ( entryToTypeAndName ( registry ) )
152
170
. map ( assertNoWildcardInDestructiveEntries )
153
171
. flatMap ( typeAndNameToMetadataComponents ( { directoryPaths, registry } ) )
154
172
. map ( ( mdComponent ) => new SourceComponent ( { type : mdComponent . type , name : mdComponent . fullName } ) )
155
- . map ( addToComponentSet ( componentSet , DestructiveChangesType . PRE ) ) ;
173
+ . map ( addToComponentSet ( componentSetToReturn , DestructiveChangesType . PRE ) ) ;
156
174
}
157
175
if ( metadata . destructiveEntriesPost ) {
158
176
metadata . destructiveEntriesPost
177
+ . filter ( filterPsuedoTypes )
159
178
. map ( entryToTypeAndName ( registry ) )
160
179
. map ( assertNoWildcardInDestructiveEntries )
161
180
. flatMap ( typeAndNameToMetadataComponents ( { directoryPaths, registry } ) )
162
181
. map ( ( mdComponent ) => new SourceComponent ( { type : mdComponent . type , name : mdComponent . fullName } ) )
163
- . map ( addToComponentSet ( componentSet , DestructiveChangesType . POST ) ) ;
182
+ . map ( addToComponentSet ( componentSetToReturn , DestructiveChangesType . POST ) ) ;
164
183
}
165
184
166
185
const resolvedComponents = ComponentSet . fromSource ( {
@@ -169,39 +188,38 @@ export class ComponentSetBuilder {
169
188
registry,
170
189
} ) ;
171
190
172
- if ( resolvedComponents . forceIgnoredPaths ) {
191
+ if ( resolvedComponents ? .forceIgnoredPaths ) {
173
192
// if useFsForceIgnore = true, then we won't be able to resolve a forceignored path,
174
193
// which we need to do to get the ignored source component
175
194
const resolver = new MetadataResolver ( registry , undefined , false ) ;
176
195
177
196
for ( const ignoredPath of resolvedComponents . forceIgnoredPaths ?? [ ] ) {
178
197
resolver . getComponentsFromPath ( ignoredPath ) . map ( ( ignored ) => {
179
- componentSet = componentSet ?. filter (
198
+ componentSetToReturn = componentSetToReturn ?. filter (
180
199
( resolved ) => ! ( resolved . fullName === ignored . name && resolved . type === ignored . type )
181
200
) ;
182
201
} ) ;
183
202
}
184
- componentSet . forceIgnoredPaths = resolvedComponents . forceIgnoredPaths ;
203
+ componentSetToReturn . forceIgnoredPaths = resolvedComponents . forceIgnoredPaths ;
185
204
}
186
205
187
- resolvedComponents . toArray ( ) . map ( addToComponentSet ( componentSet ) ) ;
206
+ resolvedComponents ? .toArray ( ) . map ( addToComponentSet ( componentSetToReturn ) ) ;
188
207
}
189
208
190
209
// Resolve metadata entries with an org connection
191
210
if ( org ) {
192
- componentSet ??= new ComponentSet ( undefined , registry ) ;
193
211
const orgComponentSet = await this . resolveOrgComponents ( registry , options ) ;
194
- orgComponentSet . toArray ( ) . map ( addToComponentSet ( componentSet ) ) ;
212
+ orgComponentSet . toArray ( ) . map ( addToComponentSet ( componentSetToReturn ) ) ;
195
213
}
196
214
197
215
// 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 ;
216
+ componentSetToReturn = assertComponentSetIsNotUndefined ( componentSetToReturn ) ;
217
+ componentSetToReturn . apiVersion ??= options . apiversion ;
218
+ componentSetToReturn . sourceApiVersion ??= options . sourceapiversion ;
219
+ componentSetToReturn . projectDirectory = options . projectDir ;
202
220
203
- logComponents ( componentSet ) ;
204
- return componentSet ;
221
+ logComponents ( componentSetToReturn ) ;
222
+ return componentSetToReturn ;
205
223
}
206
224
207
225
private static async resolveOrgComponents (
@@ -331,6 +349,12 @@ export const entryToTypeAndName =
331
349
return { type, metadataName : name . length ? name . join ( ':' ) . trim ( ) : '*' } ;
332
350
} ;
333
351
352
+ const filterPsuedoTypes = ( value : string ) : boolean => {
353
+ const x = Object . values ( PSEUDO_TYPES ) . map ( ( p ) => p . toLowerCase ( ) ) ;
354
+ const [ typeName ] = value . split ( ':' ) ;
355
+ return ! x . includes ( typeName . toLowerCase ( ) ) ;
356
+ } ;
357
+
334
358
const typeAndNameToMetadataComponents =
335
359
( context : { directoryPaths : ManifestOption [ 'directoryPaths' ] ; registry : RegistryAccess } ) =>
336
360
( { type, metadataName } : MetadataTypeAndMetadataName ) : MetadataComponent [ ] =>
0 commit comments