Skip to content

Commit bcd3a9f

Browse files
authored
W-19263098 fix: web perf (#1604)
* refactor: top-level imports from core * refactor: remove deepfreeze in favor of ts readonly * refactor: create dir, but don't open/close file unnecessarily * fix: only one object in the stream at a time on the web * refactor: createWriteStream can create files, just not dirs * perf: pass existing registry when creating retrieveResult * test: remove test of mkdirp
1 parent eea5935 commit bcd3a9f

35 files changed

+95
-102
lines changed

src/client/deployMessages.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77

88
import { basename, dirname, extname, join, posix, sep } from 'node:path/posix';
9-
import { SfError } from '@salesforce/core';
9+
import { SfError } from '@salesforce/core/sfError';
1010
import { ensureArray } from '@salesforce/kit';
1111
import { ComponentLike, SourceComponent } from '../resolve';
1212
import { registry } from '../registry/registry';

src/client/diagnosticUtil.ts

Lines changed: 1 addition & 1 deletion
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 { basename } from 'node:path';
8-
import { SfError } from '@salesforce/core';
8+
import { SfError } from '@salesforce/core/sfError';
99
import { SourceComponent } from '../resolve/sourceComponent';
1010
import { registry } from '../registry/registry';
1111
import { ComponentDiagnostic, DeployMessage } from './types';

src/client/metadataApiDeploy.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import { format } from 'node:util';
99
import { isString } from '@salesforce/ts-types';
1010
import JSZip from 'jszip';
1111
import fs from 'graceful-fs';
12-
import { Lifecycle, Messages, SfError, envVars } from '@salesforce/core';
12+
import { Lifecycle } from '@salesforce/core/lifecycle';
13+
import { Messages } from '@salesforce/core/messages';
14+
import { SfError } from '@salesforce/core/sfError';
15+
import { envVars } from '@salesforce/core/envVars';
1316
import { ensureArray } from '@salesforce/kit';
1417
import { RegistryAccess } from '../registry/registryAccess';
1518
import { ReplacementEvent } from '../convert/types';
@@ -152,7 +155,11 @@ export class MetadataApiDeploy extends MetadataTransfer<
152155
}
153156
const connection = await this.getConnection();
154157
// Recasting to use the project's version of the type
155-
return connection.metadata.checkDeployStatus(this.id, true, this.isRestDeploy) as unknown as MetadataApiDeployStatus;
158+
return connection.metadata.checkDeployStatus(
159+
this.id,
160+
true,
161+
this.isRestDeploy
162+
) as unknown as MetadataApiDeployStatus;
156163
}
157164

158165
/**

src/client/metadataApiRetrieve.ts

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@ import { join, parse } from 'node:path';
88
import fs from 'graceful-fs';
99
import JSZip from 'jszip';
1010
import { asBoolean, isString } from '@salesforce/ts-types';
11-
import { Messages, SfError, Lifecycle } from '@salesforce/core';
11+
import { Messages } from '@salesforce/core/messages';
12+
import { SfError } from '@salesforce/core/sfError';
13+
import { Lifecycle } from '@salesforce/core/lifecycle';
1214
import { ensureArray } from '@salesforce/kit';
15+
import { RegistryAccess } from '../registry/registryAccess';
1316
import { ComponentSet } from '../collections/componentSet';
1417
import { MetadataTransfer } from './metadataTransfer';
1518
import {
@@ -46,9 +49,10 @@ export class RetrieveResult implements MetadataTransferResult {
4649
public readonly response: MetadataApiRetrieveStatus,
4750
public readonly components: ComponentSet,
4851
localComponents?: ComponentSet,
49-
private partialDeleteFileResponses: FileResponse[] = []
52+
private partialDeleteFileResponses: FileResponse[] = [],
53+
registry?: RegistryAccess
5054
) {
51-
this.localComponents = new ComponentSet(localComponents?.getSourceComponents());
55+
this.localComponents = new ComponentSet(localComponents?.getSourceComponents(), registry);
5256
}
5357

5458
public getFileResponses(): FileResponse[] {
@@ -196,10 +200,15 @@ export class MetadataApiRetrieve extends MetadataTransfer<
196200
}));
197201
}
198202
}
199-
200203
componentSet ??= new ComponentSet(undefined, this.options.registry);
201204

202-
const retrieveResult = new RetrieveResult(result, componentSet, this.components, partialDeleteFileResponses);
205+
const retrieveResult = new RetrieveResult(
206+
result,
207+
componentSet,
208+
this.components,
209+
partialDeleteFileResponses,
210+
this.options.registry
211+
);
203212
if (!isMdapiRetrieve && !this.options.suppressEvents) {
204213
// This should only be done when retrieving source format since retrieving
205214
// mdapi format has no conversion or events/hooks
@@ -209,7 +218,6 @@ export class MetadataApiRetrieve extends MetadataTransfer<
209218
orgId: this.orgId,
210219
} as ScopedPostRetrieve);
211220
}
212-
213221
return retrieveResult;
214222
}
215223

@@ -245,7 +253,9 @@ export class MetadataApiRetrieve extends MetadataTransfer<
245253
apiVersion: this.components?.sourceApiVersion ?? (await connection.retrieveMaxApiVersion()),
246254
...(manifestData ? { unpackaged: manifestData } : {}),
247255
...(this.options.singlePackage ? { singlePackage: this.options.singlePackage } : {}),
248-
...(this.options.rootTypesWithDependencies ? { rootTypesWithDependencies: this.options.rootTypesWithDependencies } : {}),
256+
...(this.options.rootTypesWithDependencies
257+
? { rootTypesWithDependencies: this.options.rootTypesWithDependencies }
258+
: {}),
249259
// if we're retrieving with packageNames add it
250260
// otherwise don't - it causes errors if undefined or an empty array
251261
...(packageNames.length ? { packageNames } : {}),

src/client/retrieveExtract.ts

Lines changed: 1 addition & 1 deletion
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 * as path from 'node:path';
8-
import { Logger } from '@salesforce/core';
8+
import { Logger } from '@salesforce/core/logger';
99
import { isString } from '@salesforce/ts-types';
1010
import fs from 'graceful-fs';
1111
import { ConvertOutputConfig } from '../convert/types';

src/collections/decodeableMap.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Licensed under the BSD 3-Clause license.
55
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
66
*/
7-
import { Logger } from '@salesforce/core';
7+
import { Logger } from '@salesforce/core/logger';
88
import { isString } from '@salesforce/ts-types';
99

1010
/**

src/convert/convertContext/nonDecompositionFinalizer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
import { join } from 'node:path';
88
import { ensureString, getString, JsonMap } from '@salesforce/ts-types';
9-
import { SfProject } from '@salesforce/core';
9+
import { SfProject } from '@salesforce/core/project';
1010
import { getXmlElement } from '../../utils/decomposed';
1111
import { META_XML_SUFFIX, XML_NS_KEY, XML_NS_URL } from '../../common/constants';
1212
import { ComponentSet } from '../../collections/componentSet';

src/convert/convertContext/recompositionFinalizer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
import { join } from 'node:path';
88
import { JsonMap } from '@salesforce/ts-types';
9-
import { Messages } from '@salesforce/core';
9+
import { Messages } from '@salesforce/core/messages';
1010
import { extractUniqueElementValue, getXmlElement, unwrapAndOmitNS } from '../../utils/decomposed';
1111
import { MetadataComponent } from '../../resolve/types';
1212
import { XML_NS_KEY, XML_NS_URL } from '../../common/constants';

src/convert/metadataConverter.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
*/
77
import { Readable, PassThrough } from 'node:stream';
88
import { dirname, join, normalize } from 'node:path';
9-
import { Messages, SfError } from '@salesforce/core';
9+
import { Messages } from '@salesforce/core/messages';
10+
import { SfError } from '@salesforce/core/sfError';
1011
import { promises, mkdirSync } from 'graceful-fs';
1112
import { isString } from '@salesforce/ts-types';
13+
import { Global } from '@salesforce/core';
1214
import { SourceComponent } from '../resolve/sourceComponent';
1315
import { MetadataResolver } from '../resolve/metadataResolver';
1416
import { SourcePath } from '../common/types';
@@ -40,6 +42,10 @@ export class MetadataConverter {
4042
output: ConvertOutputConfig
4143
): Promise<ConvertResult> {
4244
try {
45+
// jszip does not behave well in web environments when retrieving multiple files.
46+
// it has a minified `browser` target which has a v3 ReadableStream, but the extensions are using polyfilles of v4.
47+
// Setting the highWaterMark to 1 seems to fix the issue.
48+
const streamOptions = Global.isWeb ? { highWaterMark: 1 } : {};
4349
const cs = comps instanceof ComponentSet ? comps : new ComponentSet(comps, this.registry);
4450
const components = (
4551
(comps instanceof ComponentSet ? Array.from(comps.getSourceComponents()) : comps) as SourceComponent[]
@@ -58,10 +64,10 @@ export class MetadataConverter {
5864
} = await getConvertIngredients(output, cs, targetFormatIsSource, this.registry);
5965

6066
const conversionPipeline = getPipeline()(
61-
Readable.from(components),
67+
Readable.from(components, streamOptions),
6268
!targetFormatIsSource && (process.env.SF_APPLY_REPLACEMENTS_ON_CONVERT === 'true' || output.type === 'zip')
6369
? (await getReplacementMarkingStream(cs.projectDirectory)) ?? new PassThrough({ objectMode: true })
64-
: new PassThrough({ objectMode: true }),
70+
: new PassThrough({ objectMode: true, ...streamOptions }),
6571
new ComponentConverter(targetFormat, this.registry, mergeSet, defaultDirectory),
6672
writer
6773
);

src/convert/streams.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77
import { isAbsolute, join } from 'node:path';
88
import { pipeline as cbPipeline, Readable, Transform, Writable, Stream } from 'node:stream';
99
import { promisify } from 'node:util';
10-
import { Messages, SfError } from '@salesforce/core';
10+
import { Messages } from '@salesforce/core/messages';
11+
import { SfError } from '@salesforce/core/sfError';
1112
import JSZip from 'jszip';
1213
import { createWriteStream, existsSync, promises as fsPromises } from 'graceful-fs';
1314
import { JsonMap } from '@salesforce/ts-types';
1415
import { XMLBuilder } from 'fast-xml-parser';
15-
import { Logger } from '@salesforce/core';
16+
import { Logger } from '@salesforce/core/logger';
1617
import { SourceComponent } from '../resolve/sourceComponent';
1718
import { SourcePath } from '../common/types';
1819
import { XML_COMMENT_PROP_NAME, XML_DECL } from '../common/constants';
@@ -159,7 +160,7 @@ export class StandardWriter extends ComponentWriter {
159160
chunk.writeInfos
160161
.map(makeWriteInfoAbsolute(this.rootDestination))
161162
.filter(existsOrDoesntMatchIgnored(this.forceignore, this.logger)) // Skip files matched by default ignore
162-
.map((info) => {
163+
.map(async (info) => {
163164
if (info.shouldDelete) {
164165
this.deleted.push({
165166
filePath: info.output,
@@ -187,7 +188,7 @@ export class StandardWriter extends ComponentWriter {
187188
toResolve.add(info.output);
188189
}
189190

190-
ensureFileExists(info.output);
191+
await ensureFileExists(info.output);
191192
return getPipeline()(info.source, createWriteStream(info.output));
192193
})
193194
);

0 commit comments

Comments
 (0)