From b112335d7f16c3d1a248a1f1c2c83752b98cc035 Mon Sep 17 00:00:00 2001 From: Willie Ruemmele Date: Thu, 6 Mar 2025 16:04:17 -0700 Subject: [PATCH] chore: follow IDEs warnings, improvements, switch to promise read to see perf --- .gitignore | 6 ------ src/client/metadataApiDeploy.ts | 2 +- src/client/metadataTransfer.ts | 2 +- src/client/types.ts | 2 -- src/collections/componentSet.ts | 8 +++----- src/collections/componentSetBuilder.ts | 13 +++++++++++++ src/convert/metadataConverter.ts | 2 +- src/convert/replacements.ts | 5 +---- src/convert/streams.ts | 2 +- src/registry/registryAccess.ts | 2 +- src/resolve/adapters/sourceAdapterFactory.ts | 4 ++-- src/resolve/connectionResolver.ts | 8 ++++---- src/resolve/manifestResolver.ts | 2 +- src/resolve/treeContainers.ts | 5 ++--- src/utils/path.ts | 7 ++----- test/collections/componentSet.test.ts | 3 +-- test/resolve/treeContainers.test.ts | 2 +- test/snapshot/helper/conversions.ts | 15 ++------------- test/utils/getMissingTypes.ts | 5 ++--- 19 files changed, 39 insertions(+), 56 deletions(-) diff --git a/.gitignore b/.gitignore index a58550cb12..fae7066216 100644 --- a/.gitignore +++ b/.gitignore @@ -20,9 +20,6 @@ xunit.xml junit-custom.xml *.received.* -# nyc test coverage -.nyc_output - # Eclipse .project @@ -91,9 +88,6 @@ typings/ # Optional REPL history .node_repl_history -# Output of 'npm pack' -*.tgz - # Yarn Integrity file .yarn-integrity diff --git a/src/client/metadataApiDeploy.ts b/src/client/metadataApiDeploy.ts index 5b8086481d..5a88f30bde 100644 --- a/src/client/metadataApiDeploy.ts +++ b/src/client/metadataApiDeploy.ts @@ -152,7 +152,7 @@ export class MetadataApiDeploy extends MetadataTransfer< } const connection = await this.getConnection(); // Recasting to use the project's version of the type - return connection.metadata.checkDeployStatus(this.id, true) as unknown as MetadataApiDeployStatus; + return (await connection.metadata.checkDeployStatus(this.id, true)) as unknown as MetadataApiDeployStatus; } /** diff --git a/src/client/metadataTransfer.ts b/src/client/metadataTransfer.ts index 72dd9c693c..c6e719f12d 100644 --- a/src/client/metadataTransfer.ts +++ b/src/client/metadataTransfer.ts @@ -46,7 +46,7 @@ export abstract class MetadataTransfer< private transferId: Options['id']; private event = new EventEmitter(); private usernameOrConnection: string | Connection; - private apiVersion?: string; + private readonly apiVersion?: string; public constructor({ usernameOrConnection, components, apiVersion, id }: Options) { this.usernameOrConnection = usernameOrConnection; diff --git a/src/client/types.ts b/src/client/types.ts index 035bbdb4bb..5aab4392ba 100644 --- a/src/client/types.ts +++ b/src/client/types.ts @@ -140,8 +140,6 @@ export type MetadataApiDeployStatus = { export type DeployDetails = { componentFailures?: DeployMessage | DeployMessage[]; componentSuccesses?: DeployMessage | DeployMessage[]; - // TODO: Add types for RetrieveResult - // retrieveResult?: runTestResult?: RunTestResult; }; diff --git a/src/collections/componentSet.ts b/src/collections/componentSet.ts index ffce5bb427..66797ed4ad 100644 --- a/src/collections/componentSet.ts +++ b/src/collections/componentSet.ts @@ -221,12 +221,10 @@ export class ComponentSet extends LazyCollection { if (resolveIncludeSet && !deletionType) { resolveIncludeSet.add(component); } - if (resolvePreSet && deletionType === DestructiveChangesType.PRE) { - resolvePreSet.add(component, DestructiveChangesType.PRE); - } - if (resolvePostSet && deletionType === DestructiveChangesType.POST) { - resolvePostSet.add(component, DestructiveChangesType.POST); + if (resolvePreSet && deletionType) { + resolvePreSet.add(component, deletionType); } + const memberIsWildcard = component.fullName === ComponentSet.WILDCARD; if (options.resolveSourcePaths === undefined || !memberIsWildcard || options.forceAddWildcards) { result.add(component, deletionType); diff --git a/src/collections/componentSetBuilder.ts b/src/collections/componentSetBuilder.ts index 37b138ae33..d60fd86570 100644 --- a/src/collections/componentSetBuilder.ts +++ b/src/collections/componentSetBuilder.ts @@ -319,6 +319,19 @@ const getOrgComponentFilter = ( ): FromConnectionOptions['componentFilter'] => metadata?.metadataEntries?.length ? (component: Partial): boolean => { + // { + // "createdById": "005KR000000mVHLYA2", + // "createdByName": "User User", + // "createdDate": "2025-03-05T21:15:23.000Z", + // "fileName": "classes/FileUtilitiesTest.cls", + // "fullName": "FileUtilitiesTest", + // "id": "01pKR000000FgMQYA0", + // "lastModifiedById": "005KR000000mVHLYA2", + // "lastModifiedByName": "User User", + // "lastModifiedDate": "2025-03-05T21:15:23.000Z", + // "manageableState": "unmanaged", + // "type": "ApexClass" + // } if (component.type && component.fullName) { const mdMapEntry = mdMap.get(component.type); // using minimatch versus RegExp provides better (more expected) matching results diff --git a/src/convert/metadataConverter.ts b/src/convert/metadataConverter.ts index ef88cff9b9..6a8293c8a7 100644 --- a/src/convert/metadataConverter.ts +++ b/src/convert/metadataConverter.ts @@ -29,7 +29,7 @@ export class MetadataConverter { public static readonly DESTRUCTIVE_CHANGES_PRE_XML_FILE = 'destructiveChangesPre.xml'; public static readonly DEFAULT_PACKAGE_PREFIX = 'metadataPackage'; - private registry: RegistryAccess; + private readonly registry: RegistryAccess; public constructor(registry = new RegistryAccess()) { this.registry = registry; diff --git a/src/convert/replacements.ts b/src/convert/replacements.ts index e583b32419..59505deb06 100644 --- a/src/convert/replacements.ts +++ b/src/convert/replacements.ts @@ -66,10 +66,7 @@ export const replacementIterations = async (input: string, replacements: MarkedR const lifecycleInstance = Lifecycle.getInstance(); let output = input; for (const replacement of replacements) { - // TODO: node 16+ has String.replaceAll for non-regex scenarios - const regex = - typeof replacement.toReplace === 'string' ? new RegExp(replacement.toReplace, 'g') : replacement.toReplace; - const replaced = output.replace(regex, replacement.replaceWith ?? ''); + const replaced = output.replaceAll(new RegExp(replacement.toReplace, 'g'), replacement.replaceWith ?? ''); if (replaced !== output) { output = replaced; diff --git a/src/convert/streams.ts b/src/convert/streams.ts index 35e9f9a8da..ab687d505f 100644 --- a/src/convert/streams.ts +++ b/src/convert/streams.ts @@ -118,7 +118,7 @@ export abstract class ComponentWriter extends Writable { protected rootDestination?: SourcePath; protected logger: Logger; - public constructor(rootDestination?: SourcePath) { + protected constructor(rootDestination?: SourcePath) { super({ objectMode: true }); this.rootDestination = rootDestination; this.logger = Logger.childFromRoot(this.constructor.name); diff --git a/src/registry/registryAccess.ts b/src/registry/registryAccess.ts index aa8ba7f6ce..8cc348d9a8 100644 --- a/src/registry/registryAccess.ts +++ b/src/registry/registryAccess.ts @@ -17,7 +17,7 @@ Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@salesforce/source-deploy-retrieve', 'sdr'); export class RegistryAccess { - private registry: MetadataRegistry; + private readonly registry: MetadataRegistry; private strictFolderTypes?: MetadataType[]; private folderContentTypes?: MetadataType[]; private aliasTypes?: MetadataType[]; diff --git a/src/resolve/adapters/sourceAdapterFactory.ts b/src/resolve/adapters/sourceAdapterFactory.ts index b802942d78..c95760842d 100644 --- a/src/resolve/adapters/sourceAdapterFactory.ts +++ b/src/resolve/adapters/sourceAdapterFactory.ts @@ -22,8 +22,8 @@ Messages.importMessagesDirectory(__dirname); const messages = Messages.loadMessages('@salesforce/source-deploy-retrieve', 'sdr'); export class SourceAdapterFactory { - private registry: RegistryAccess; - private tree: TreeContainer; + private readonly registry: RegistryAccess; + private readonly tree: TreeContainer; public constructor(registry: RegistryAccess, tree: TreeContainer) { this.registry = registry; diff --git a/src/resolve/connectionResolver.ts b/src/resolve/connectionResolver.ts index 73f39f7e38..63b8115888 100644 --- a/src/resolve/connectionResolver.ts +++ b/src/resolve/connectionResolver.ts @@ -52,14 +52,14 @@ const getLogger = (): Logger => { * in the registry. */ export class ConnectionResolver { - private connection: Connection; - private registry: RegistryAccess; + private readonly connection: Connection; + private readonly registry: RegistryAccess; // Array of metadata type names to use for listMembers. By default it includes // all types defined in the registry. - private mdTypeNames: string[]; + private readonly mdTypeNames: string[]; - private requestBatchSize: number; + private readonly requestBatchSize: number; public constructor(connection: Connection, registry = new RegistryAccess(), mdTypes?: string[]) { this.connection = connection; diff --git a/src/resolve/manifestResolver.ts b/src/resolve/manifestResolver.ts index 5967d7ca81..4ca1eae430 100644 --- a/src/resolve/manifestResolver.ts +++ b/src/resolve/manifestResolver.ts @@ -102,7 +102,7 @@ const getValidatedType = (typeMembers: ParsedPackageTypeMembers): ParsedPackageTypeMembers => { let typeName = typeMembers.name; // protect against empty/invalid typeMember definitions in the manifest - if (typeof typeName !== 'string' || typeName.length === 0) { + if (typeName.length === 0) { if (typeof typeName === 'object') { typeName = JSON.stringify(typeName); } diff --git a/src/resolve/treeContainers.ts b/src/resolve/treeContainers.ts index 6462acd217..d43ea75ad4 100644 --- a/src/resolve/treeContainers.ts +++ b/src/resolve/treeContainers.ts @@ -7,7 +7,7 @@ /* eslint-disable class-methods-use-this */ import { join, dirname, basename, normalize, sep } from 'node:path'; import { Readable } from 'node:stream'; -import { statSync, existsSync, readdirSync, createReadStream, readFileSync } from 'graceful-fs'; +import { statSync, existsSync, readdirSync, createReadStream, promises, readFileSync } from 'graceful-fs'; import JSZip from 'jszip'; import { Messages, SfError } from '@salesforce/core'; import { isString } from '@salesforce/ts-types'; @@ -105,8 +105,7 @@ export class NodeFSTreeContainer extends TreeContainer { } public readFile(fsPath: SourcePath): Promise { - // significant enough performance increase using sync instead of fs.promise version - return Promise.resolve(readFileSync(fsPath)); + return promises.readFile(fsPath); } public readFileSync(fsPath: SourcePath): Buffer { diff --git a/src/utils/path.ts b/src/utils/path.ts index 69312c130d..cf8a575466 100644 --- a/src/utils/path.ts +++ b/src/utils/path.ts @@ -5,7 +5,7 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { basename, dirname, extname, sep, join } from 'node:path'; +import { basename, dirname, extname, join, sep } from 'node:path'; import { Optional } from '@salesforce/ts-types'; import { SfdxFileFormat } from '../convert/types'; import { SourcePath } from '../common/types'; @@ -116,10 +116,7 @@ export function parseNestedFullName(fsPath: string, directoryName: string): stri return; } const pathPrefix = pathSplits.slice(pathSplits.lastIndexOf(directoryName) + 1); - // the eslint comment should remain until strictMode is fully implemented - // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion - const fileName = (pathSplits.pop() as string).replace('-meta.xml', '').split('.')[0]; - pathPrefix[pathPrefix.length - 1] = fileName; + pathPrefix[pathPrefix.length - 1] = (pathSplits.pop() as string).replace('-meta.xml', '').split('.')[0]; return pathPrefix.join('/'); } diff --git a/test/collections/componentSet.test.ts b/test/collections/componentSet.test.ts index a595d71814..150edddaac 100644 --- a/test/collections/componentSet.test.ts +++ b/test/collections/componentSet.test.ts @@ -439,8 +439,7 @@ describe('ComponentSet', () => { apiVersion: testApiVersionAsString, }); $$.SANDBOX.stub(RegistryAccess.prototype, 'getTypeByName').returns(registry.types.apexclass); - const manifest = manifestFiles.ONE_FOLDER_MEMBER; - const set = await ComponentSet.fromManifest(manifest.name); + const set = await ComponentSet.fromManifest(manifestFiles.ONE_FOLDER_MEMBER.name); const result = set.toArray(); diff --git a/test/resolve/treeContainers.test.ts b/test/resolve/treeContainers.test.ts index 0bb7af61e9..4cb6b0fc23 100644 --- a/test/resolve/treeContainers.test.ts +++ b/test/resolve/treeContainers.test.ts @@ -108,7 +108,7 @@ describe('Tree Containers', () => { }); it('should use expected Node API for readFile', async () => { - const readFileStub = env.stub(fs, 'readFileSync'); + const readFileStub = env.stub(fs.promises, 'readFile'); // @ts-ignore wants Dirents but string[] works as well readFileStub.withArgs(path).resolves(Buffer.from('test')); const data = await tree.readFile(path); diff --git a/test/snapshot/helper/conversions.ts b/test/snapshot/helper/conversions.ts index 65f2377f22..258a2ba33b 100644 --- a/test/snapshot/helper/conversions.ts +++ b/test/snapshot/helper/conversions.ts @@ -128,11 +128,9 @@ const getFullPath = (file: fs.Dirent) => path.join(file.path, file.name); /** dirEnts are sometimes folder, we don't want those. And we need the full paths */ export const dirEntsToPaths = (dirEnts: fs.Dirent[]): string[] => dirEnts.filter(isFile).map(getFullPath); -const shouldIgnore = (file: string): boolean => { +const shouldIgnore = (file: string): boolean => // binary zip/unzip isn't exactly the same, so we "skip" that one - if (file.includes('leafletjs.resource')) return true; - return false; -}; + file.includes('leafletjs.resource'); /** * rather than the full path, gets the "project relative" parts based on format @@ -151,12 +149,3 @@ const pathPartsAfter = (file: string, after: string): string => { const parts = file.split(path.sep); return parts.slice(parts.indexOf(after) + 1).join(path.sep); }; - -/** Wrap a function with it or pass it to map, and it will log the contents */ -// @ts-ignore - keep this around for use when debugging. -// eslint-disable-next-line @typescript-eslint/no-unused-vars -const logArgs = (args: T): T => { - // eslint-disable-next-line no-console - typeof args === 'string' ? console.log(args) : JSON.stringify(args, null, 2); - return args; -}; diff --git a/test/utils/getMissingTypes.ts b/test/utils/getMissingTypes.ts index a4c78e0441..578165d9e7 100644 --- a/test/utils/getMissingTypes.ts +++ b/test/utils/getMissingTypes.ts @@ -4,7 +4,7 @@ * Licensed under the BSD 3-Clause license. * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { CoverageObjectType, CoverageObject } from '../../src/registry/types'; +import { CoverageObject, CoverageObjectType } from '../../src/registry/types'; import { hasUnsupportedFeatures, metadataTypes } from '../../src/registry/nonSupportedTypes'; import { MetadataRegistry } from '../../src'; @@ -23,6 +23,5 @@ export const getMissingTypes = ( regType.name, ...(regType.children ? Object.values(regType.children.types).map((child) => child.name) : []), ]); - const missingTypes = metadataApiTypesFromCoverage.filter(([key]) => !registryTypeNames.includes(key)); - return missingTypes; + return metadataApiTypesFromCoverage.filter(([key]) => !registryTypeNames.includes(key)); };