Skip to content

Commit 73228f3

Browse files
fix: quick-action-definition (#590)
* refactor: simplify logger and maxRevision * fix: quickActionDefinition isn't a real mdtype * refactor: use newer error * test: update for logger refactor * chore: bump deps for xnuts * Update remoteSourceTrackingService.ts link to WI assigned to Platform Actions * chore: bump deps --------- Co-authored-by: Cristian Dominguez <6853656+cristiand391@users.noreply.github.com>
1 parent bde6cfc commit 73228f3

File tree

4 files changed

+65
-93
lines changed

4 files changed

+65
-93
lines changed

package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@
5050
},
5151
"dependencies": {
5252
"@oclif/core": "^3.26.6",
53-
"@salesforce/core": "^7.3.8",
53+
"@salesforce/core": "^7.3.9",
5454
"@salesforce/kit": "^3.1.1",
55-
"@salesforce/source-deploy-retrieve": "^11.4.4",
55+
"@salesforce/source-deploy-retrieve": "^11.6.1",
5656
"@salesforce/ts-types": "^2.0.9",
5757
"fast-xml-parser": "^4.3.6",
5858
"graceful-fs": "^4.2.11",
@@ -63,7 +63,7 @@
6363
"@salesforce/cli-plugins-testkit": "^5.3.4",
6464
"@salesforce/dev-scripts": "^9.1.2",
6565
"@types/graceful-fs": "^4.1.9",
66-
"eslint-plugin-sf-plugin": "^1.18.3",
66+
"eslint-plugin-sf-plugin": "^1.18.4",
6767
"ts-node": "^10.9.2",
6868
"ts-patch": "^3.1.2",
6969
"typescript": "^5.4.5"

src/shared/remoteSourceTrackingService.ts

+40-43
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export type Contents = {
3030
sourceMembers: Record<string, MemberRevision>;
3131
};
3232
type MemberRevisionMapEntry = [string, MemberRevision];
33+
type PinoLogger = ReturnType<(typeof Logger)['getRawRootLogger']>;
3334

3435
const FILENAME = 'maxRevision.json';
3536

@@ -88,7 +89,7 @@ export class RemoteSourceTrackingService {
8889
private static instanceMap = new Map<string, RemoteSourceTrackingService>();
8990
public readonly filePath: string;
9091

91-
private logger!: Logger;
92+
private logger!: PinoLogger;
9293
private serverMaxRevisionCounter = 0;
9394
private sourceMembers = new Map<string, MemberRevision>();
9495

@@ -146,10 +147,8 @@ export class RemoteSourceTrackingService {
146147
if (elements.length === 0) {
147148
return;
148149
}
149-
const quiet = elements.length > 100;
150-
if (quiet) {
151-
this.logger.debug(`Syncing ${elements.length} Revisions by key`);
152-
}
150+
const quietLogger = elements.length > 100 ? this.logger.silent : this.logger.debug;
151+
quietLogger(`Syncing ${elements.length} Revisions by key`);
153152

154153
// 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
155154
// any item in an aura/LWC bundle needs to represent the top (bundle) level and the file itself
@@ -159,11 +158,9 @@ export class RemoteSourceTrackingService {
159158
if (!revision) {
160159
this.logger.warn(`found no matching revision for ${metadataKey}`);
161160
} else if (doesNotMatchServer(revision)) {
162-
if (!quiet) {
163-
this.logger.debug(
164-
`Syncing ${metadataKey} revision from ${revision.lastRetrievedFromServer} to ${revision.serverRevisionCounter}`
165-
);
166-
}
161+
quietLogger(
162+
`Syncing ${metadataKey} revision from ${revision.lastRetrievedFromServer} to ${revision.serverRevisionCounter}`
163+
);
167164
this.setMemberRevision(metadataKey, { ...revision, lastRetrievedFromServer: revision.serverRevisionCounter });
168165
}
169166
});
@@ -377,13 +374,17 @@ ${formatSourceMemberWarnings(outstandingSourceMembers)}`
377374
if (sourceMembers.length === 0) {
378375
return;
379376
}
380-
const quiet = sourceMembers.length > 100;
381-
if (quiet) {
382-
this.logger.debug(`Upserting ${sourceMembers.length} SourceMembers to maxRevision.json`);
383-
}
377+
const quietLogger = sourceMembers.length > 100 ? this.logger.silent : this.logger.debug;
378+
quietLogger(`Upserting ${sourceMembers.length} SourceMembers to maxRevision.json`);
384379

385-
let serverMaxRevisionCounter = this.serverMaxRevisionCounter;
386-
sourceMembers.forEach((change) => {
380+
// Update the serverMaxRevisionCounter to the highest RevisionCounter
381+
this.serverMaxRevisionCounter = Math.max(
382+
this.serverMaxRevisionCounter,
383+
...sourceMembers.map((m) => m.RevisionCounter)
384+
);
385+
this.logger.debug(`Updating serverMaxRevisionCounter to ${this.serverMaxRevisionCounter}`);
386+
387+
sourceMembers.map((change) => {
387388
// try accessing the sourceMembers object at the index of the change's name
388389
// if it exists, we'll update the fields - if it doesn't, we'll create and insert it
389390
const key = getMetadataKey(change.MemberType, change.MemberName);
@@ -395,35 +396,23 @@ ${formatSourceMemberWarnings(outstandingSourceMembers)}`
395396
};
396397
if (sourceMember.lastRetrievedFromServer) {
397398
// We are already tracking this element so we'll update it
398-
if (!quiet) {
399-
this.logger.debug(
400-
`Updating ${key} to RevisionCounter: ${change.RevisionCounter}${sync ? ' and syncing' : ''}`
401-
);
402-
}
399+
quietLogger(`Updating ${key} to RevisionCounter: ${change.RevisionCounter}${sync ? ' and syncing' : ''}`);
403400
sourceMember.serverRevisionCounter = change.RevisionCounter;
404401
sourceMember.isNameObsolete = change.IsNameObsolete;
405-
} else if (!quiet) {
402+
} else {
406403
// We are not yet tracking it so we'll insert a new record
407-
this.logger.debug(
408-
`Inserting ${key} with RevisionCounter: ${change.RevisionCounter}${sync ? ' and syncing' : ''}`
409-
);
404+
quietLogger(`Inserting ${key} with RevisionCounter: ${change.RevisionCounter}${sync ? ' and syncing' : ''}`);
410405
}
411406

412407
// If we are syncing changes then we need to update the lastRetrievedFromServer field to
413408
// match the RevisionCounter from the SourceMember.
414409
if (sync) {
415410
sourceMember.lastRetrievedFromServer = change.RevisionCounter;
416411
}
417-
// Keep track of the highest RevisionCounter for setting the serverMaxRevisionCounter
418-
if (change.RevisionCounter > serverMaxRevisionCounter) {
419-
serverMaxRevisionCounter = change.RevisionCounter;
420-
}
412+
421413
// Update the state with the latest SourceMember data
422414
this.setMemberRevision(key, sourceMember);
423415
});
424-
// Update the serverMaxRevisionCounter to the highest RevisionCounter
425-
this.serverMaxRevisionCounter = serverMaxRevisionCounter;
426-
this.logger.debug(`Updating serverMaxRevisionCounter to ${serverMaxRevisionCounter}`);
427416

428417
await this.write();
429418
}
@@ -435,7 +424,7 @@ ${formatSourceMemberWarnings(outstandingSourceMembers)}`
435424
const messages = Messages.loadMessages('@salesforce/source-tracking', 'source');
436425
throw new SfError(messages.getMessage('NonSourceTrackedOrgError'), 'NonSourceTrackedOrgError');
437426
}
438-
this.logger = await Logger.child(this.constructor.name);
427+
this.logger = Logger.getRawRootLogger().child({ name: this.constructor.name });
439428
if (fs.existsSync(this.filePath)) {
440429
// read the file contents and turn it into the map
441430
const rawContents = await readFileContents(this.filePath);
@@ -486,9 +475,7 @@ ${formatSourceMemberWarnings(outstandingSourceMembers)}`
486475

487476
// because `serverMaxRevisionCounter` is always updated, we need to select > to catch the most recent change
488477
const query = `SELECT MemberType, MemberName, IsNameObsolete, RevisionCounter FROM SourceMember WHERE RevisionCounter > ${rev}`;
489-
if (!quiet) {
490-
this.logger.debug(`Query: ${query}`);
491-
}
478+
this.logger[quiet ? 'silent' : 'debug'](`Query: ${query}`);
492479
const queryResult = await queryFn(this.org.getConnection(), query);
493480
this.queryCache.set(rev, queryResult);
494481

@@ -536,15 +523,15 @@ const revisionToRemoteChangeElement = ([memberKey, memberRevision]: MemberRevisi
536523
* iterate SourceMember keys and compare their decoded value with the decoded key.
537524
* if there's a match, return the matching decoded key, otherwise, return the original key
538525
*/
539-
function getDecodedKeyIfSourceMembersHas({
526+
const getDecodedKeyIfSourceMembersHas = ({
540527
key,
541528
sourceMembers,
542529
logger,
543530
}: {
544531
sourceMembers: Map<string, MemberRevision>;
545532
key: string;
546-
logger: Logger;
547-
}): string {
533+
logger: PinoLogger;
534+
}): string => {
548535
try {
549536
const originalKeyDecoded = decodeURIComponent(key);
550537
const match = Array.from(sourceMembers.keys()).find(
@@ -560,7 +547,7 @@ function getDecodedKeyIfSourceMembersHas({
560547
logger.debug(`Could not decode metadata key: ${key} due to: ${errMsg}`);
561548
}
562549
return key;
563-
}
550+
};
564551

565552
const getFilePath = (orgId: string): string => path.join('.sf', 'orgs', orgId, FILENAME);
566553

@@ -579,7 +566,7 @@ const readFileContents = async (filePath: string): Promise<Contents | Record<str
579566
};
580567

581568
export const calculateTimeout =
582-
(logger: Logger) =>
569+
(logger: PinoLogger) =>
583570
(memberCount: number): Duration => {
584571
const overriddenTimeout = env.getNumber('SFDX_SOURCE_MEMBER_POLLING_TIMEOUT', 0);
585572
if (overriddenTimeout > 0) {
@@ -603,9 +590,11 @@ export const querySourceMembersTo = async (conn: Connection, toRevision: number)
603590

604591
const queryFn = async (conn: Connection, query: string): Promise<SourceMember[]> => {
605592
try {
606-
return (await conn.tooling.query<SourceMember>(query, { autoFetch: true, maxFetch: 50_000 })).records;
593+
return (await conn.tooling.query<SourceMember>(query, { autoFetch: true, maxFetch: 50_000 })).records.map(
594+
sourceMemberCorrections
595+
);
607596
} catch (error) {
608-
throw error instanceof Error ? SfError.wrap(error) : error;
597+
throw SfError.wrap(error);
609598
}
610599
};
611600

@@ -625,3 +614,11 @@ const revisionDoesNotMatch = ([, member]: MemberRevisionMapEntry): boolean => do
625614

626615
const doesNotMatchServer = (member: MemberRevision): boolean =>
627616
member.serverRevisionCounter !== member.lastRetrievedFromServer;
617+
618+
/** A series of workarounds for server-side bugs. Each bug should be filed against a team, with a WI, so we know when these are fixed and can be removed */
619+
const sourceMemberCorrections = (sourceMember: SourceMember): SourceMember => {
620+
if (sourceMember.MemberType === 'QuickActionDefinition') {
621+
return { ...sourceMember, MemberType: 'QuickAction' }; // W-15837125
622+
}
623+
return sourceMember;
624+
};

test/unit/remoteSourceTracking.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ describe('remoteSourceTrackingService', () => {
584584
});
585585

586586
describe('calculateTimeout', () => {
587-
const logger = new Logger({ useMemoryLogger: true, name: 'test' });
587+
const logger = new Logger({ useMemoryLogger: true, name: 'test' }).getRawLogger();
588588
const functionUnderTest = calculateTimeout(logger);
589589
afterEach(() => {
590590
delete process.env.SFDX_SOURCE_MEMBER_POLLING_TIMEOUT;

yarn.lock

+21-46
Original file line numberDiff line numberDiff line change
@@ -598,14 +598,14 @@
598598
strip-ansi "6.0.1"
599599
ts-retry-promise "^0.8.0"
600600

601-
"@salesforce/core@^7.3.1", "@salesforce/core@^7.3.5", "@salesforce/core@^7.3.8":
602-
version "7.3.8"
603-
resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-7.3.8.tgz#8a646b5321f08c0fb4d22e2fa8b1d60b3a20df9b"
604-
integrity sha512-VWhXHfjwjtC3pJWYp8wt5/fnNQ5tK61ovMG5eteXzVD2oFd7og1f6YjwuAzoYIZK7kYWWv7KJfGtCsPs7Zw+Ww==
601+
"@salesforce/core@^7.3.5", "@salesforce/core@^7.3.8", "@salesforce/core@^7.3.9":
602+
version "7.3.9"
603+
resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-7.3.9.tgz#8abe2b3e2393989d11e92b7a6b96043fc9d5b9c8"
604+
integrity sha512-eJqDiA5b7wU50Ee/xjmGzSnHrNVJ8S77B7enfX30gm7gxU3i3M3QeBdiV6XAOPLSIL96DseofP6Tv6c+rljlKA==
605605
dependencies:
606606
"@jsforce/jsforce-node" "^3.2.0"
607607
"@salesforce/kit" "^3.1.1"
608-
"@salesforce/schemas" "^1.7.0"
608+
"@salesforce/schemas" "^1.9.0"
609609
"@salesforce/ts-types" "^2.0.9"
610610
ajv "^8.13.0"
611611
change-case "^4.1.2"
@@ -671,15 +671,15 @@
671671
resolved "https://registry.yarnpkg.com/@salesforce/prettier-config/-/prettier-config-0.0.3.tgz#ba648d4886bb38adabe073dbea0b3a91b3753bb0"
672672
integrity sha512-hYOhoPTCSYMDYn+U1rlEk16PoBeAJPkrdg4/UtAzupM1mRRJOwEPMG1d7U8DxJFKuXW3DMEYWr2MwAIBDaHmFg==
673673

674-
"@salesforce/schemas@^1.7.0":
675-
version "1.7.0"
676-
resolved "https://registry.yarnpkg.com/@salesforce/schemas/-/schemas-1.7.0.tgz#b7e0af3ee414ae7160bce351c0184d77ccb98fe3"
677-
integrity sha512-Z0PiCEV55khm0PG+DsnRYCjaDmacNe3HDmsoSm/CSyYvJJm+D5vvkHKN9/PKD/gaRe8XAU836yfamIYFblLINw==
674+
"@salesforce/schemas@^1.9.0":
675+
version "1.9.0"
676+
resolved "https://registry.yarnpkg.com/@salesforce/schemas/-/schemas-1.9.0.tgz#ba477a112653a20b4edcf989c61c57bdff9aa3ca"
677+
integrity sha512-LiN37zG5ODT6z70sL1fxF7BQwtCX9JOWofSU8iliSNIM+WDEeinnoFtVqPInRSNt8I0RiJxIKCrqstsmQRBNvA==
678678

679-
"@salesforce/source-deploy-retrieve@^11.4.4":
680-
version "11.4.4"
681-
resolved "https://registry.yarnpkg.com/@salesforce/source-deploy-retrieve/-/source-deploy-retrieve-11.4.4.tgz#c853e0888c6a5b64c4af3e705010ef1a6dac4c13"
682-
integrity sha512-6dohRR9t6Aj2mbHzfYtbphxqxF83AwmAjkFFQPB6+Yn1ceVKmJjd0WY23fgWTTaTum+2pnw9XA35qwu4naBCVw==
679+
"@salesforce/source-deploy-retrieve@^11.6.1":
680+
version "11.6.1"
681+
resolved "https://registry.yarnpkg.com/@salesforce/source-deploy-retrieve/-/source-deploy-retrieve-11.6.1.tgz#381d7ecb41025fee71db32e765b8fbf434255a4d"
682+
integrity sha512-7v52S871V0fzIABxWmcvbI4iELTAyniiBM0+HHAvwO2rGclULKIf4IgkomL4l4Hz4BPd2v0fRlLJ4INkG/3+sA==
683683
dependencies:
684684
"@salesforce/core" "^7.3.5"
685685
"@salesforce/kit" "^3.1.1"
@@ -2238,12 +2238,12 @@ eslint-plugin-jsdoc@^46.10.1:
22382238
semver "^7.5.4"
22392239
spdx-expression-parse "^4.0.0"
22402240

2241-
eslint-plugin-sf-plugin@^1.18.3:
2242-
version "1.18.3"
2243-
resolved "https://registry.yarnpkg.com/eslint-plugin-sf-plugin/-/eslint-plugin-sf-plugin-1.18.3.tgz#8711ba1544e86fb8227375415865fca2c3566348"
2244-
integrity sha512-Cl2ZpraMOwOm/kDn2hlud7mkDH3OrImueAyX8nkX1LA0kFma9/yokdxabWE/uaPpWPUlADeqgKWwgTjgf75SYQ==
2241+
eslint-plugin-sf-plugin@^1.18.4:
2242+
version "1.18.4"
2243+
resolved "https://registry.yarnpkg.com/eslint-plugin-sf-plugin/-/eslint-plugin-sf-plugin-1.18.4.tgz#59a41e224d620e20d0fe0e3902c43208c2629037"
2244+
integrity sha512-bPYmEh+5ARunhIfBoHc9UqrvPslRcYcloXJRKWqVkvU8tIBAiq2lqp6GWjVuUMPGjhvtUgICMolp6ozjO9wvmA==
22452245
dependencies:
2246-
"@salesforce/core" "^7.3.1"
2246+
"@salesforce/core" "^7.3.8"
22472247
"@typescript-eslint/utils" "^6.17.0"
22482248

22492249
eslint-plugin-unicorn@^50.0.1:
@@ -5178,16 +5178,7 @@ srcset@^5.0.0:
51785178
resolved "https://registry.yarnpkg.com/srcset/-/srcset-5.0.0.tgz#9df6c3961b5b44a02532ce6ae4544832609e2e3f"
51795179
integrity sha512-SqEZaAEhe0A6ETEa9O1IhSPC7MdvehZtCnTR0AftXk3QhY2UNgb+NApFOUPZILXk/YTDfFxMTNJOBpzrJsEdIA==
51805180

5181-
"string-width-cjs@npm:string-width@^4.2.0":
5182-
version "4.2.3"
5183-
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
5184-
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
5185-
dependencies:
5186-
emoji-regex "^8.0.0"
5187-
is-fullwidth-code-point "^3.0.0"
5188-
strip-ansi "^6.0.1"
5189-
5190-
string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
5181+
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
51915182
version "4.2.3"
51925183
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
51935184
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -5246,14 +5237,7 @@ string_decoder@~1.1.1:
52465237
dependencies:
52475238
safe-buffer "~5.1.0"
52485239

5249-
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
5250-
version "6.0.1"
5251-
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
5252-
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
5253-
dependencies:
5254-
ansi-regex "^5.0.1"
5255-
5256-
strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1:
5240+
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1:
52575241
version "6.0.1"
52585242
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
52595243
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -5770,7 +5754,7 @@ workerpool@6.2.1:
57705754
resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343"
57715755
integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==
57725756

5773-
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
5757+
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
57745758
version "7.0.0"
57755759
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
57765760
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
@@ -5788,15 +5772,6 @@ wrap-ansi@^6.2.0:
57885772
string-width "^4.1.0"
57895773
strip-ansi "^6.0.0"
57905774

5791-
wrap-ansi@^7.0.0:
5792-
version "7.0.0"
5793-
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
5794-
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
5795-
dependencies:
5796-
ansi-styles "^4.0.0"
5797-
string-width "^4.1.0"
5798-
strip-ansi "^6.0.0"
5799-
58005775
wrap-ansi@^8.1.0:
58015776
version "8.1.0"
58025777
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"

0 commit comments

Comments
 (0)