Skip to content

Commit 8ef5883

Browse files
committed
perf: use flatmap
1 parent c72f8a7 commit 8ef5883

File tree

3 files changed

+36
-50
lines changed

3 files changed

+36
-50
lines changed

src/commands/force/source/status.ts

+5-7
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,9 @@ export default class SourceStatus extends SfdxCommand {
8080
excludeUnresolvable: true,
8181
});
8282

83-
outputRows = outputRows.concat(localAdds.map((item) => this.statusResultToOutputRows(item, 'add')).flat());
84-
outputRows = outputRows.concat(
85-
localModifies.map((item) => this.statusResultToOutputRows(item, 'changed')).flat()
86-
);
87-
outputRows = outputRows.concat(localDeletes.map((item) => this.statusResultToOutputRows(item, 'delete')).flat());
83+
outputRows = outputRows.concat(localAdds.flatMap((item) => this.statusResultToOutputRows(item, 'add')));
84+
outputRows = outputRows.concat(localModifies.flatMap((item) => this.statusResultToOutputRows(item, 'changed')));
85+
outputRows = outputRows.concat(localDeletes.flatMap((item) => this.statusResultToOutputRows(item, 'delete')));
8886
}
8987

9088
if (this.flags.remote || this.flags.all || (!this.flags.local && !this.flags.all)) {
@@ -94,8 +92,8 @@ export default class SourceStatus extends SfdxCommand {
9492
tracking.getChanges<ChangeResult>({ origin: 'remote', state: 'delete', format: 'ChangeResult' }),
9593
tracking.getChanges<ChangeResult>({ origin: 'remote', state: 'nondelete', format: 'ChangeResult' }),
9694
]);
97-
outputRows = outputRows.concat(remoteDeletes.map((item) => this.statusResultToOutputRows(item)).flat());
98-
outputRows = outputRows.concat(remoteModifies.map((item) => this.statusResultToOutputRows(item)).flat());
95+
outputRows = outputRows.concat(remoteDeletes.flatMap((item) => this.statusResultToOutputRows(item)));
96+
outputRows = outputRows.concat(remoteModifies.flatMap((item) => this.statusResultToOutputRows(item)));
9997
}
10098

10199
if (!this.flags.local && !this.flags.remote) {

src/shared/remoteSourceTrackingService.ts

+12-14
Original file line numberDiff line numberDiff line change
@@ -202,22 +202,20 @@ export class RemoteSourceTrackingService extends ConfigFile<RemoteSourceTracking
202202
// this can be super-repetitive on a large ExperienceBundle where there is an element for each file but only one Revision for the entire bundle
203203
// any item in an aura/LWC bundle needs to represent the top (bundle) level and the file itself
204204
// so we de-dupe via a set
205-
Array.from(new Set(elements.map((element) => getMetadataKeyFromFileResponse(element)).flat())).map(
206-
(metadataKey) => {
207-
const revision = revisions[metadataKey];
208-
if (revision && revision.lastRetrievedFromServer !== revision.serverRevisionCounter) {
209-
if (!quiet) {
210-
this.logger.debug(
211-
`Syncing ${metadataKey} revision from ${revision.lastRetrievedFromServer} to ${revision.serverRevisionCounter}`
212-
);
213-
}
214-
revision.lastRetrievedFromServer = revision.serverRevisionCounter;
215-
this.setMemberRevision(metadataKey, revision);
216-
} else {
217-
this.logger.warn(`found no matching revision for ${metadataKey}`);
205+
Array.from(new Set(elements.flatMap((element) => getMetadataKeyFromFileResponse(element)))).map((metadataKey) => {
206+
const revision = revisions[metadataKey];
207+
if (revision && revision.lastRetrievedFromServer !== revision.serverRevisionCounter) {
208+
if (!quiet) {
209+
this.logger.debug(
210+
`Syncing ${metadataKey} revision from ${revision.lastRetrievedFromServer} to ${revision.serverRevisionCounter}`
211+
);
218212
}
213+
revision.lastRetrievedFromServer = revision.serverRevisionCounter;
214+
this.setMemberRevision(metadataKey, revision);
215+
} else {
216+
this.logger.warn(`found no matching revision for ${metadataKey}`);
219217
}
220-
);
218+
});
221219

222220
await this.write();
223221
}

src/sourceTracking.ts

+19-29
Original file line numberDiff line numberDiff line change
@@ -125,21 +125,19 @@ export class SourceTracking extends AsyncCreatable {
125125
const resolverForDeletes = new MetadataResolver(undefined, filenamesToVirtualTree(deletes));
126126

127127
nonDeletes
128-
.map((filename) => {
128+
.flatMap((filename) => {
129129
try {
130130
return resolverForNonDeletes.getComponentsFromPath(filename);
131131
} catch (e) {
132132
this.logger.warn(`unable to resolve ${filename}`);
133133
return undefined;
134134
}
135135
})
136-
.flat()
137136
.filter(sourceComponentGuard)
138137
.map((component) => componentSet.add(component));
139138

140139
deletes
141-
.map((filename) => resolverForDeletes.getComponentsFromPath(filename))
142-
.flat()
140+
.flatMap((filename) => resolverForDeletes.getComponentsFromPath(filename))
143141
.filter(sourceComponentGuard)
144142
.map((component) => componentSet.add(component, true));
145143

@@ -189,26 +187,23 @@ export class SourceTracking extends AsyncCreatable {
189187
if (changesToDelete.length > 0) {
190188
// build a component set of the deleted types
191189
const changesToDeleteWithFilePaths = this.populateFilePaths(changesToDelete);
192-
deletesAsFileResponse = changesToDeleteWithFilePaths
193-
.map((changeResult) =>
194-
changeResult && changeResult.filenames
195-
? changeResult.filenames.map(
196-
(filename) =>
197-
({
198-
type: changeResult.type,
199-
fullName: changeResult.name as string,
200-
filePath: filename,
201-
state: ComponentStatus.Deleted,
202-
} as FileResponse) // this assertion is because it matches the unexported Success flavor of FileResponse
203-
)
204-
: []
205-
)
206-
.flat();
190+
deletesAsFileResponse = changesToDeleteWithFilePaths.flatMap((changeResult) =>
191+
changeResult && changeResult.filenames
192+
? changeResult.filenames.map(
193+
(filename) =>
194+
({
195+
type: changeResult.type,
196+
fullName: changeResult.name as string,
197+
filePath: filename,
198+
state: ComponentStatus.Deleted,
199+
} as FileResponse) // this assertion is because it matches the unexported Success flavor of FileResponse
200+
)
201+
: []
202+
);
207203
// delete the files
208204
const filenames = changesToDeleteWithFilePaths
209205
// TODO: test that this works for undefined, string and string[]
210-
.map((change) => change.filenames as string[])
211-
.flat()
206+
.flatMap((change) => change.filenames as string[])
212207
.filter(Boolean);
213208
await Promise.all(filenames.map((filename) => fs.promises.unlink(filename)));
214209
await Promise.all([
@@ -303,15 +298,14 @@ export class SourceTracking extends AsyncCreatable {
303298
: new MetadataResolver();
304299

305300
return filenames
306-
.map((filename) => {
301+
.flatMap((filename) => {
307302
try {
308303
return resolver.getComponentsFromPath(filename);
309304
} catch (e) {
310305
this.logger.warn(`unable to resolve ${filename}`);
311306
return undefined;
312307
}
313308
})
314-
.flat()
315309
.filter(sourceComponentGuard) as T[];
316310
}
317311
}
@@ -471,23 +465,19 @@ export class SourceTracking extends AsyncCreatable {
471465
}
472466

473467
this.logger.debug(`populateTypesAndNames for ${elements.length} change elements`);
474-
const filenames = elements
475-
.map((element) => element.filenames)
476-
.flat()
477-
.filter(stringGuard);
468+
const filenames = elements.flatMap((element) => element.filenames).filter(stringGuard);
478469

479470
// component set generated from the filenames on all local changes
480471
const resolver = new MetadataResolver(undefined, resolveDeleted ? filenamesToVirtualTree(filenames) : undefined);
481472
const sourceComponents = filenames
482-
.map((filename) => {
473+
.flatMap((filename) => {
483474
try {
484475
return resolver.getComponentsFromPath(filename);
485476
} catch (e) {
486477
this.logger.warn(`unable to resolve ${filename}`);
487478
return undefined;
488479
}
489480
})
490-
.flat()
491481
.filter(sourceComponentGuard);
492482

493483
this.logger.debug(` matching SourceComponents have ${sourceComponents.length} items from local`);

0 commit comments

Comments
 (0)