sf-delta-tests 0.0.20 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commands/delta/test-classes.d.ts +6 -4
- package/lib/commands/delta/test-classes.js +56 -22
- package/lib/commands/delta/test-classes.js.map +1 -1
- package/lib/elements/object-types.d.ts +9 -0
- package/lib/elements/object-types.js +31 -0
- package/lib/elements/object-types.js.map +1 -0
- package/lib/services/apex-class-service.js +1 -0
- package/lib/services/apex-class-service.js.map +1 -1
- package/lib/services/cli-service.d.ts +5 -0
- package/lib/services/cli-service.js +17 -0
- package/lib/services/cli-service.js.map +1 -0
- package/lib/services/dependency-service.d.ts +0 -1
- package/lib/services/dependency-service.js +14 -50
- package/lib/services/dependency-service.js.map +1 -1
- package/lib/services/dependency-services.test.js +2 -5
- package/lib/services/dependency-services.test.js.map +1 -1
- package/lib/services/manifest-service.js +5 -0
- package/lib/services/manifest-service.js.map +1 -1
- package/lib/services/output-service.d.ts +0 -1
- package/lib/services/output-service.js +0 -12
- package/lib/services/output-service.js.map +1 -1
- package/messages/delta.test-classes.md +5 -13
- package/oclif.manifest.json +9 -18
- package/package.json +1 -1
|
@@ -4,22 +4,24 @@ import { DependencyService } from '../../services/dependency-service';
|
|
|
4
4
|
import { ApexClassService } from '../../services/apex-class-service';
|
|
5
5
|
import { ManifestService } from '../../services/manifest-service';
|
|
6
6
|
import { OutputService } from '../../services/output-service';
|
|
7
|
+
import { CliService } from '../../services/cli-service';
|
|
7
8
|
export type DeltaTestClassesResult = {
|
|
8
|
-
|
|
9
|
+
testNames: string[];
|
|
10
|
+
cli: string;
|
|
9
11
|
};
|
|
10
12
|
export default class TestClasses extends SfCommand<DeltaTestClassesResult> {
|
|
11
13
|
static readonly summary: string;
|
|
12
14
|
static readonly description: string;
|
|
13
15
|
static readonly examples: string[];
|
|
14
16
|
static readonly flags: {
|
|
15
|
-
name: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
16
17
|
'target-org': import("@oclif/core/lib/interfaces").OptionFlag<import("@salesforce/core").Org, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
17
|
-
'
|
|
18
|
+
'package-path': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
18
19
|
};
|
|
19
20
|
private dependencyService;
|
|
20
21
|
private apexClassService;
|
|
21
22
|
private outputService;
|
|
22
23
|
private manifestService;
|
|
23
|
-
|
|
24
|
+
private cliService;
|
|
25
|
+
constructor(argv: string[], config: Config, dependencyService?: DependencyService, apexClassService?: ApexClassService, outputService?: OutputService, manifestService?: ManifestService, cliService?: CliService);
|
|
24
26
|
run(): Promise<DeltaTestClassesResult>;
|
|
25
27
|
}
|
|
@@ -6,65 +6,99 @@ const dependency_service_1 = require("../../services/dependency-service");
|
|
|
6
6
|
const apex_class_service_1 = require("../../services/apex-class-service");
|
|
7
7
|
const manifest_service_1 = require("../../services/manifest-service");
|
|
8
8
|
const output_service_1 = require("../../services/output-service");
|
|
9
|
+
const cli_service_1 = require("../../services/cli-service");
|
|
9
10
|
core_1.Messages.importMessagesDirectory(__dirname);
|
|
10
11
|
const messages = core_1.Messages.loadMessages('sf-delta-tests', 'delta.test-classes');
|
|
11
12
|
class TestClasses extends sf_plugins_core_1.SfCommand {
|
|
12
|
-
constructor(argv, config, dependencyService = new dependency_service_1.DependencyService(), apexClassService = new apex_class_service_1.ApexClassService(), outputService = new output_service_1.OutputService(), manifestService = new manifest_service_1.ManifestService()) {
|
|
13
|
+
constructor(argv, config, dependencyService = new dependency_service_1.DependencyService(), apexClassService = new apex_class_service_1.ApexClassService(), outputService = new output_service_1.OutputService(), manifestService = new manifest_service_1.ManifestService(), cliService = new cli_service_1.CliService()) {
|
|
13
14
|
super(argv, config);
|
|
14
15
|
this.dependencyService = dependencyService;
|
|
15
16
|
this.apexClassService = apexClassService;
|
|
16
17
|
this.outputService = outputService;
|
|
17
18
|
this.manifestService = manifestService;
|
|
19
|
+
this.cliService = cliService;
|
|
18
20
|
}
|
|
19
21
|
async run() {
|
|
20
22
|
try {
|
|
21
23
|
const { flags } = await this.parse(TestClasses);
|
|
24
|
+
// Connect to SF org
|
|
22
25
|
const org = flags['target-org'];
|
|
23
26
|
const conn = org.getConnection(undefined);
|
|
24
27
|
this.dependencyService.connect(conn);
|
|
28
|
+
this.debug('Getting dependencies from SF');
|
|
29
|
+
// Download all dependencies from SF
|
|
25
30
|
const combinedApexClassData = await this.dependencyService.getDependenciesByObjects();
|
|
26
|
-
|
|
27
|
-
await
|
|
28
|
-
|
|
31
|
+
// Write into output folder
|
|
32
|
+
await this.outputService.dependencyData(combinedApexClassData);
|
|
33
|
+
this.debug(`Loading metadata from ${flags['package-path']}`);
|
|
34
|
+
// Get manifest data and transform that into a list of metadata
|
|
35
|
+
const manifestData = await this.manifestService.parseManifest(flags['package-path']);
|
|
29
36
|
const changedMetadata = this.manifestService.extractMetadataComponents(manifestData);
|
|
37
|
+
this.debug({ manifestData: manifestData.components, changedMetadata });
|
|
38
|
+
// If no meaningful changed metadata, no need to run tests (layout changes don't need tests!)
|
|
39
|
+
if (changedMetadata.length === 0) {
|
|
40
|
+
this.debug('No meaningful changed metadata, do not run any tests. (example, layout changes do not need tests ran)');
|
|
41
|
+
this.log(this.cliService.noTests());
|
|
42
|
+
return {
|
|
43
|
+
testNames: [],
|
|
44
|
+
cli: this.cliService.noTests(),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// Too many changes, just run all
|
|
48
|
+
if (changedMetadata.length > 40) {
|
|
49
|
+
this.debug(`Found over 40 changed metadata items (${changedMetadata.length}), running all tests`);
|
|
50
|
+
this.log(this.cliService.allTests());
|
|
51
|
+
return { testNames: [], cli: this.cliService.allTests() };
|
|
52
|
+
}
|
|
53
|
+
this.debug('Calculating the related apex classes...');
|
|
54
|
+
// The magic function. From the changed metadata get all the Apex Classes that could be connected to the changed metadata
|
|
30
55
|
const classList = this.dependencyService.getRelatedApexClasses(combinedApexClassData, changedMetadata);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
this.
|
|
56
|
+
this.debug({ classList });
|
|
57
|
+
this.debug('Filtering the apex classes to only tests...');
|
|
58
|
+
// Filter the total class list to only tests
|
|
59
|
+
const testNames = await this.apexClassService.filterApexTest(classList);
|
|
60
|
+
const simpleTestNames = this.apexClassService.filterApexTestSimple(classList);
|
|
61
|
+
this.debug({ testNames, simpleTestNames });
|
|
62
|
+
if (testNames.length === 0) {
|
|
63
|
+
this.debug('No relevant tests found, skip running tests');
|
|
64
|
+
// TODO: Debate this one, if we found no relevant tests, should all or none be ran?
|
|
65
|
+
this.log(this.cliService.noTests());
|
|
66
|
+
return {
|
|
67
|
+
testNames,
|
|
68
|
+
cli: this.cliService.noTests(),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
this.debug(`Found meaningful and related tests: ${testNames.join(', ')}`);
|
|
72
|
+
this.log(this.cliService.specificTests(testNames));
|
|
36
73
|
return {
|
|
37
|
-
|
|
74
|
+
testNames,
|
|
75
|
+
cli: this.cliService.specificTests(testNames),
|
|
38
76
|
};
|
|
39
77
|
}
|
|
40
78
|
catch (e) {
|
|
41
79
|
if (e instanceof Error) {
|
|
42
|
-
this.log('Unknown error');
|
|
43
80
|
this.error([e.toString(), e.name, e.stack].join('\n'), { exit: false });
|
|
44
81
|
}
|
|
45
|
-
|
|
82
|
+
this.log(this.cliService.allTests());
|
|
83
|
+
return { testNames: [], cli: this.cliService.allTests() };
|
|
46
84
|
}
|
|
47
85
|
}
|
|
48
86
|
}
|
|
49
87
|
TestClasses.summary = messages.getMessage('summary');
|
|
50
88
|
TestClasses.description = messages.getMessage('description');
|
|
51
89
|
TestClasses.examples = messages.getMessages('examples');
|
|
90
|
+
// TODO: Add in parameters to tune the max revision depth, max changed metadata
|
|
91
|
+
// TODO: Add in parameters to allow fetching other object types for dependencies and meaningful types
|
|
52
92
|
TestClasses.flags = {
|
|
53
|
-
name: sf_plugins_core_1.Flags.string({
|
|
54
|
-
summary: messages.getMessage('flags.name.summary'),
|
|
55
|
-
description: messages.getMessage('flags.name.description'),
|
|
56
|
-
char: 'n',
|
|
57
|
-
required: false,
|
|
58
|
-
}),
|
|
59
93
|
'target-org': sf_plugins_core_1.Flags.requiredOrg({
|
|
60
94
|
summary: messages.getMessage('flags.target-org.summary'),
|
|
61
95
|
char: 'o',
|
|
62
96
|
required: true,
|
|
63
97
|
}),
|
|
64
|
-
'
|
|
65
|
-
summary: messages.getMessage('flags.
|
|
66
|
-
char: '
|
|
67
|
-
|
|
98
|
+
'package-path': sf_plugins_core_1.Flags.string({
|
|
99
|
+
summary: messages.getMessage('flags.package-path.summary'),
|
|
100
|
+
char: 'p',
|
|
101
|
+
default: 'manifest/package.xml',
|
|
68
102
|
}),
|
|
69
103
|
};
|
|
70
104
|
exports.default = TestClasses;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-classes.js","sourceRoot":"","sources":["../../../src/commands/delta/test-classes.ts"],"names":[],"mappings":";;AAAA,iEAA+D;AAC/D,2CAA4C;AAE5C,0EAAsE;AACtE,0EAAqE;AACrE,sEAAkE;AAClE,kEAA8D;
|
|
1
|
+
{"version":3,"file":"test-classes.js","sourceRoot":"","sources":["../../../src/commands/delta/test-classes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const APEX_CLASS = "ApexClass";
|
|
2
|
+
export declare const APEX_TRIGGER = "ApexTrigger";
|
|
3
|
+
export declare const CUSTOM_OBJECT = "CustomObject";
|
|
4
|
+
export declare const FLOW = "Flow";
|
|
5
|
+
export declare const LIGHTNING_COMPONENT_BUNDLE = "LightningComponentBundle";
|
|
6
|
+
export declare const AURA_DEFINITION_BUNDLE = "AuraDefinitionBundle";
|
|
7
|
+
export declare const CUSTOM_METADATA = "CustomMetadata";
|
|
8
|
+
export declare const defaultTypesToFetchFromDependencyServer: string[];
|
|
9
|
+
export declare const meaningfulMetadataChanges: string[];
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.meaningfulMetadataChanges = exports.defaultTypesToFetchFromDependencyServer = exports.CUSTOM_METADATA = exports.AURA_DEFINITION_BUNDLE = exports.LIGHTNING_COMPONENT_BUNDLE = exports.FLOW = exports.CUSTOM_OBJECT = exports.APEX_TRIGGER = exports.APEX_CLASS = void 0;
|
|
4
|
+
exports.APEX_CLASS = 'ApexClass';
|
|
5
|
+
exports.APEX_TRIGGER = 'ApexTrigger';
|
|
6
|
+
exports.CUSTOM_OBJECT = 'CustomObject';
|
|
7
|
+
exports.FLOW = 'Flow';
|
|
8
|
+
exports.LIGHTNING_COMPONENT_BUNDLE = 'LightningComponentBundle';
|
|
9
|
+
exports.AURA_DEFINITION_BUNDLE = 'AuraDefinitionBundle';
|
|
10
|
+
exports.CUSTOM_METADATA = 'CustomMetadata';
|
|
11
|
+
// TODO: Consider Setting
|
|
12
|
+
exports.defaultTypesToFetchFromDependencyServer = [
|
|
13
|
+
exports.APEX_CLASS,
|
|
14
|
+
exports.APEX_TRIGGER,
|
|
15
|
+
exports.CUSTOM_OBJECT,
|
|
16
|
+
exports.FLOW,
|
|
17
|
+
exports.LIGHTNING_COMPONENT_BUNDLE,
|
|
18
|
+
exports.AURA_DEFINITION_BUNDLE,
|
|
19
|
+
exports.CUSTOM_METADATA,
|
|
20
|
+
];
|
|
21
|
+
// TODO: Review
|
|
22
|
+
exports.meaningfulMetadataChanges = [
|
|
23
|
+
exports.APEX_CLASS,
|
|
24
|
+
exports.APEX_TRIGGER,
|
|
25
|
+
exports.CUSTOM_OBJECT,
|
|
26
|
+
exports.FLOW,
|
|
27
|
+
exports.LIGHTNING_COMPONENT_BUNDLE,
|
|
28
|
+
exports.AURA_DEFINITION_BUNDLE,
|
|
29
|
+
exports.CUSTOM_METADATA,
|
|
30
|
+
];
|
|
31
|
+
//# sourceMappingURL=object-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-types.js","sourceRoot":"","sources":["../../src/elements/object-types.ts"],"names":[],"mappings":";;;AAAa,QAAA,UAAU,GAAG,WAAW,CAAC;AACzB,QAAA,YAAY,GAAG,aAAa,CAAC;AAC7B,QAAA,aAAa,GAAG,cAAc,CAAC;AAC/B,QAAA,IAAI,GAAG,MAAM,CAAC;AACd,QAAA,0BAA0B,GAAG,0BAA0B,CAAC;AACxD,QAAA,sBAAsB,GAAG,sBAAsB,CAAC;AAChD,QAAA,eAAe,GAAG,gBAAgB,CAAC;AAChD,yBAAyB;AACZ,QAAA,uCAAuC,GAAG;IACrD,kBAAU;IACV,oBAAY;IACZ,qBAAa;IACb,YAAI;IACJ,kCAA0B;IAC1B,8BAAsB;IACtB,uBAAe;CAChB,CAAC;AAEF,eAAe;AACF,QAAA,yBAAyB,GAAG;IACvC,kBAAU;IACV,oBAAY;IACZ,qBAAa;IACb,YAAI;IACJ,kCAA0B;IAC1B,8BAAsB;IACtB,uBAAe;CAChB,CAAC"}
|
|
@@ -9,6 +9,7 @@ class ApexClassService {
|
|
|
9
9
|
filterApexTestSimple(classList) {
|
|
10
10
|
return classList.filter((className) => className.toLowerCase().includes('test'));
|
|
11
11
|
}
|
|
12
|
+
// TODO: Allow this to be a flag for root path
|
|
12
13
|
// eslint-disable-next-line class-methods-use-this
|
|
13
14
|
async filterApexTest(classList, rootPath = 'force-app/main/default/classes') {
|
|
14
15
|
// Get all Apex Classes with the filenames `${className}.cls` in the root directory and all subdirectories
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apex-class-service.js","sourceRoot":"","sources":["../../src/services/apex-class-service.ts"],"names":[],"mappings":";;;AAAA,+BAA4D;AAC5D,0CAAuC;AACvC,+BAA4B;AAE5B,MAAa,gBAAgB;IAC3B,kDAAkD;IAC3C,oBAAoB,CAAC,SAAmB;QAC7C,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,kDAAkD;IAC3C,KAAK,CAAC,cAAc,CAAC,SAAmB,EAAE,QAAQ,GAAG,gCAAgC;QAC1F,0GAA0G;QAC1G,MAAM,WAAW,GAAG,QAAQ,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;QACvD,MAAM,cAAc,GAAG,MAAM,IAAA,WAAI,EAAC,WAAW,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QAElE,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,UAAU,CAAC;QAE/B,yEAAyE;QACzE,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;YAC1C,MAAM,UAAU,GAAG,IAAA,WAAQ,EAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,IAAA,YAAS,EAAC,UAAU,CAAC,CAAC;YACzC,4CAA4C;YAC5C,MAAM,WAAW,GAAG,CAAC,MAAM,IAAA,mBAAQ,EAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC5D,IAAI,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE;gBAC1C,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;aAC1D;SACF;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"apex-class-service.js","sourceRoot":"","sources":["../../src/services/apex-class-service.ts"],"names":[],"mappings":";;;AAAA,+BAA4D;AAC5D,0CAAuC;AACvC,+BAA4B;AAE5B,MAAa,gBAAgB;IAC3B,kDAAkD;IAC3C,oBAAoB,CAAC,SAAmB;QAC7C,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,8CAA8C;IAC9C,kDAAkD;IAC3C,KAAK,CAAC,cAAc,CAAC,SAAmB,EAAE,QAAQ,GAAG,gCAAgC;QAC1F,0GAA0G;QAC1G,MAAM,WAAW,GAAG,QAAQ,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;QACvD,MAAM,cAAc,GAAG,MAAM,IAAA,WAAI,EAAC,WAAW,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QAElE,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,UAAU,CAAC;QAE/B,yEAAyE;QACzE,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;YAC1C,MAAM,UAAU,GAAG,IAAA,WAAQ,EAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,IAAA,YAAS,EAAC,UAAU,CAAC,CAAC;YACzC,4CAA4C;YAC5C,MAAM,WAAW,GAAG,CAAC,MAAM,IAAA,mBAAQ,EAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC5D,IAAI,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE;gBAC1C,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;aAC1D;SACF;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;CACF;AA7BD,4CA6BC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CliService = void 0;
|
|
4
|
+
/* eslint-disable class-methods-use-this */
|
|
5
|
+
class CliService {
|
|
6
|
+
specificTests(tests) {
|
|
7
|
+
return `--test-level RunSpecifiedTests --tests "${tests.join(',')}"`;
|
|
8
|
+
}
|
|
9
|
+
allTests() {
|
|
10
|
+
return '--test-level RunLocalTests';
|
|
11
|
+
}
|
|
12
|
+
noTests() {
|
|
13
|
+
return '';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.CliService = CliService;
|
|
17
|
+
//# sourceMappingURL=cli-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-service.js","sourceRoot":"","sources":["../../src/services/cli-service.ts"],"names":[],"mappings":";;;AAAA,2CAA2C;AAC3C,MAAa,UAAU;IACd,aAAa,CAAC,KAAe;QAClC,OAAO,2CAA2C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACvE,CAAC;IAEM,QAAQ;QACb,OAAO,4BAA4B,CAAC;IACtC,CAAC;IAEM,OAAO;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAZD,gCAYC"}
|
|
@@ -10,7 +10,6 @@ export declare class DependencyService {
|
|
|
10
10
|
connect(connection: Connection): void;
|
|
11
11
|
getDependenciesByObjects(additionalObjects?: string[]): Promise<MetadataComponentDependency[]>;
|
|
12
12
|
getRelatedApexClasses(dependencyList: MetadataComponentDependency[], changedMetadata: string[]): string[];
|
|
13
|
-
private isApexClass;
|
|
14
13
|
private getRelations;
|
|
15
14
|
private getDependencyByObject;
|
|
16
15
|
private getDependencySoql;
|
|
@@ -1,23 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/* eslint-disable class-methods-use-this */
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
4
|
exports.DependencyService = void 0;
|
|
4
5
|
const kit_1 = require("@salesforce/kit");
|
|
5
6
|
const lodash_1 = require("lodash");
|
|
6
|
-
const
|
|
7
|
-
const DEFAULT_OBJECTS = [
|
|
8
|
-
APEX_CLASS,
|
|
9
|
-
'ApexTrigger',
|
|
10
|
-
'CustomObject',
|
|
11
|
-
'Flow',
|
|
12
|
-
'LightningComponentBundle',
|
|
13
|
-
'AuraDefinitionBundle',
|
|
14
|
-
];
|
|
7
|
+
const object_types_1 = require("../elements/object-types");
|
|
15
8
|
class DependencyService {
|
|
16
9
|
connect(connection) {
|
|
17
10
|
this.connection = connection;
|
|
18
11
|
}
|
|
19
12
|
async getDependenciesByObjects(additionalObjects = []) {
|
|
20
|
-
const objects = new Set([...
|
|
13
|
+
const objects = new Set([...object_types_1.defaultTypesToFetchFromDependencyServer, ...additionalObjects]);
|
|
21
14
|
const promises = [];
|
|
22
15
|
objects.forEach((object) => promises.push(this.getDependencyByObject(object)));
|
|
23
16
|
const results = await Promise.all(promises);
|
|
@@ -35,56 +28,29 @@ class DependencyService {
|
|
|
35
28
|
directDependencies.add(depData);
|
|
36
29
|
}
|
|
37
30
|
}
|
|
38
|
-
const dependencies = Array.from(this.getRelations(dependencyList, directDependencies));
|
|
31
|
+
const dependencies = Array.from(this.getRelations(dependencyList.filter((depData) => depData.RefMetadataComponentType === object_types_1.APEX_CLASS), directDependencies));
|
|
39
32
|
return (0, lodash_1.uniq)(dependencies
|
|
40
|
-
.filter((dependency) =>
|
|
33
|
+
.filter((dependency) => dependency.MetadataComponentType === object_types_1.APEX_CLASS)
|
|
41
34
|
.map((dependency) => dependency.MetadataComponentName));
|
|
42
35
|
}
|
|
43
|
-
|
|
44
|
-
isApexClass(dependencyList, dependency) {
|
|
45
|
-
for (const metadata of dependencyList) {
|
|
46
|
-
if ((metadata.MetadataComponentType === APEX_CLASS &&
|
|
47
|
-
metadata.MetadataComponentName === dependency.MetadataComponentName) ||
|
|
48
|
-
(metadata.RefMetadataComponentType === APEX_CLASS &&
|
|
49
|
-
metadata.RefMetadataComponentName === dependency.MetadataComponentName)) {
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
getRelations(allDependencies, relatedDependencies, relationCounter = 0) {
|
|
36
|
+
getRelations(dependenciesRelatingToApex, relatedDependencies, relationCounter = 0) {
|
|
56
37
|
const newDependencies = Array.from(relatedDependencies);
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
});*/
|
|
64
|
-
// eslint-disable-next-line no-console
|
|
65
|
-
// console.log('getRelations: before loop');
|
|
66
|
-
for (const depData of allDependencies.filter((dep) => dep.RefMetadataComponentType === APEX_CLASS)) {
|
|
67
|
-
const matchedDeps = newDependencies.filter((newDep) => newDep.MetadataComponentName === depData.RefMetadataComponentName);
|
|
68
|
-
if (matchedDeps.length > 0) {
|
|
69
|
-
matchedDeps.forEach((matchedDep) => newDependencies.push(matchedDep));
|
|
38
|
+
for (const newDep of Array.from(relatedDependencies)) {
|
|
39
|
+
for (const depRelatingToApex of dependenciesRelatingToApex) {
|
|
40
|
+
if (newDep.MetadataComponentName === depRelatingToApex.RefMetadataComponentName) {
|
|
41
|
+
newDependencies.push(depRelatingToApex);
|
|
42
|
+
// TODO: Would it make sense to short circuit this loop?
|
|
43
|
+
}
|
|
70
44
|
}
|
|
71
45
|
}
|
|
72
|
-
// eslint-disable-next-line no-console
|
|
73
|
-
// console.log('getRelations: after loop');
|
|
74
46
|
const newDependenciesSet = new Set(newDependencies);
|
|
75
|
-
// eslint-disable-next-line no-console
|
|
76
|
-
/* console.log({
|
|
77
|
-
relationCounter,
|
|
78
|
-
newDepCount: newDependenciesSet.size,
|
|
79
|
-
allDepCount: allDependencies.length,
|
|
80
|
-
relatedDepCount: relatedDependencies.size,
|
|
81
|
-
});*/
|
|
82
47
|
// Stop looking at more than 8 layers of relations
|
|
83
48
|
if (relationCounter >= 8) {
|
|
49
|
+
// TODO: Add debug statement, maybe tune 8
|
|
84
50
|
return newDependenciesSet;
|
|
85
51
|
}
|
|
86
52
|
if (newDependenciesSet.size !== relatedDependencies.size) {
|
|
87
|
-
return this.getRelations(
|
|
53
|
+
return this.getRelations(dependenciesRelatingToApex, newDependenciesSet, relationCounter + 1);
|
|
88
54
|
}
|
|
89
55
|
return newDependenciesSet;
|
|
90
56
|
}
|
|
@@ -96,7 +62,6 @@ class DependencyService {
|
|
|
96
62
|
const refDependencies = await this.connection.tooling.query(this.getRefDependencySoql(objectType));
|
|
97
63
|
return (0, kit_1.sortBy)([...dependencies.records, ...refDependencies.records], ['MetadataComponentType', 'RefMetadataComponentType']);
|
|
98
64
|
}
|
|
99
|
-
// eslint-disable-next-line class-methods-use-this
|
|
100
65
|
getDependencySoql(objectType) {
|
|
101
66
|
return `SELECT MetadataComponentName, MetadataComponentType, RefMetadataComponentName, RefMetadataComponentType
|
|
102
67
|
FROM MetadataComponentDependency
|
|
@@ -104,7 +69,6 @@ class DependencyService {
|
|
|
104
69
|
AND MetadataComponentNamespace = NULL
|
|
105
70
|
AND RefMetadataComponentNamespace = NULL`;
|
|
106
71
|
}
|
|
107
|
-
// eslint-disable-next-line class-methods-use-this
|
|
108
72
|
getRefDependencySoql(objectType) {
|
|
109
73
|
return `SELECT MetadataComponentName, MetadataComponentType, RefMetadataComponentName, RefMetadataComponentType
|
|
110
74
|
FROM MetadataComponentDependency
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-service.js","sourceRoot":"","sources":["../../src/services/dependency-service.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"dependency-service.js","sourceRoot":"","sources":["../../src/services/dependency-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
// import { TestContext } from '@salesforce/core/lib/testSetup';
|
|
4
|
-
// import { expect } from 'chai';
|
|
5
4
|
// import { stubSfCommandUx } from '@salesforce/sf-plugins-core';
|
|
6
|
-
// import World from '../../../src/commands/hello/world';
|
|
7
5
|
const fs_1 = require("fs");
|
|
8
|
-
const mocha_1 = require("mocha");
|
|
9
6
|
const chai_1 = require("chai");
|
|
10
7
|
const dependency_service_1 = require("./dependency-service");
|
|
11
8
|
describe('dependency-services', () => {
|
|
@@ -14,13 +11,13 @@ describe('dependency-services', () => {
|
|
|
14
11
|
before(() => {
|
|
15
12
|
dependencyList = JSON.parse((0, fs_1.readFileSync)('test/fixtures/dependency-exploration-sf.json').toString());
|
|
16
13
|
});
|
|
17
|
-
|
|
14
|
+
beforeEach(() => {
|
|
18
15
|
dependencyService = new dependency_service_1.DependencyService();
|
|
19
16
|
});
|
|
20
17
|
describe('getRelatedApexClasses', () => {
|
|
21
18
|
it('test', () => {
|
|
22
19
|
const results = dependencyService.getRelatedApexClasses(dependencyList, ['APIUsers']);
|
|
23
|
-
(0, chai_1.expect)(results).to.deep.eq(['APIUsersTest']);
|
|
20
|
+
(0, chai_1.expect)(results).to.deep.eq(['APIUsers', 'APIUsersTest']);
|
|
24
21
|
});
|
|
25
22
|
});
|
|
26
23
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-services.test.js","sourceRoot":"","sources":["../../src/services/dependency-services.test.ts"],"names":[],"mappings":";;AAAA,gEAAgE;AAChE,
|
|
1
|
+
{"version":3,"file":"dependency-services.test.js","sourceRoot":"","sources":["../../src/services/dependency-services.test.ts"],"names":[],"mappings":";;AAAA,gEAAgE;AAChE,iEAAiE;AACjE,2BAAkC;AAClC,+BAA8B;AAC9B,6DAAsF;AAEtF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,iBAAoC,CAAC;IACzC,IAAI,cAA6C,CAAC;IAElD,MAAM,CAAC,GAAG,EAAE;QACV,cAAc,GAAG,IAAI,CAAC,KAAK,CACzB,IAAA,iBAAY,EAAC,8CAA8C,CAAC,CAAC,QAAQ,EAAE,CACvC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE;QACd,iBAAiB,GAAG,IAAI,sCAAiB,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACd,MAAM,OAAO,GAAG,iBAAiB,CAAC,qBAAqB,CAAC,cAAc,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YACtF,IAAA,aAAM,EAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ManifestService = void 0;
|
|
4
4
|
const source_deploy_retrieve_1 = require("@salesforce/source-deploy-retrieve");
|
|
5
|
+
const object_types_1 = require("../elements/object-types");
|
|
5
6
|
class ManifestService {
|
|
6
7
|
// eslint-disable-next-line class-methods-use-this
|
|
7
8
|
async parseManifest(path = 'manifest/package.xml') {
|
|
@@ -16,6 +17,10 @@ class ManifestService {
|
|
|
16
17
|
if (component.fullName === '*') {
|
|
17
18
|
continue;
|
|
18
19
|
}
|
|
20
|
+
// Only include metadata that we care about. Aka: meaningful
|
|
21
|
+
if (!object_types_1.meaningfulMetadataChanges.includes(component.type.name)) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
19
24
|
// Children components, we want to get the parent. Example: `Account.Name` -> `Account`
|
|
20
25
|
if (component.fullName.includes('.')) {
|
|
21
26
|
const splitComponentName = component.fullName.split('.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-service.js","sourceRoot":"","sources":["../../src/services/manifest-service.ts"],"names":[],"mappings":";;;AAAA,+EAAsE;
|
|
1
|
+
{"version":3,"file":"manifest-service.js","sourceRoot":"","sources":["../../src/services/manifest-service.ts"],"names":[],"mappings":";;;AAAA,+EAAsE;AAEtE,2DAAqE;AAErE,MAAa,eAAe;IAC1B,kDAAkD;IAC3C,KAAK,CAAC,aAAa,CAAC,IAAI,GAAG,sBAAsB;QACtD,MAAM,gBAAgB,GAAG,IAAI,yCAAgB,EAAE,CAAC;QAChD,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,kDAAkD;IAC3C,yBAAyB,CAAC,YAAmC;QAClE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QACzC,KAAK,MAAM,SAAS,IAAI,YAAY,CAAC,UAAU,EAAE;YAC/C,4DAA4D;YAC5D,IAAI,SAAS,CAAC,QAAQ,KAAK,GAAG,EAAE;gBAC9B,SAAS;aACV;YAED,4DAA4D;YAC5D,IAAI,CAAC,wCAAyB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC5D,SAAS;aACV;YAED,uFAAuF;YACvF,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBACpC,MAAM,kBAAkB,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACzD,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3C;iBAAM;gBACL,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;aACxC;SACF;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;CACF;AAhCD,0CAgCC"}
|
|
@@ -3,6 +3,5 @@ export declare class OutputService {
|
|
|
3
3
|
private readonly outputFolder;
|
|
4
4
|
constructor(outputFolder?: string);
|
|
5
5
|
dependencyData(dependencyData: MetadataComponentDependency[]): Promise<void>;
|
|
6
|
-
mermaidGraph(dependencyData: MetadataComponentDependency[]): Promise<void>;
|
|
7
6
|
private write;
|
|
8
7
|
}
|
|
@@ -11,18 +11,6 @@ class OutputService {
|
|
|
11
11
|
async dependencyData(dependencyData) {
|
|
12
12
|
return this.write('dependency-graph.json', JSON.stringify(dependencyData));
|
|
13
13
|
}
|
|
14
|
-
// TODO: Refactor to be readable :)
|
|
15
|
-
async mermaidGraph(dependencyData) {
|
|
16
|
-
const dependencyStrings = new Set(dependencyData
|
|
17
|
-
.filter((dependency) => !(dependency.RefMetadataComponentType === 'CustomField' ||
|
|
18
|
-
dependency.MetadataComponentType === 'CustomField'))
|
|
19
|
-
.map((dependency) => `\t${dependency.MetadataComponentType.replace(' ', '_')}.${dependency.MetadataComponentName.replace(' ', '_')} --> ${dependency.RefMetadataComponentType.replace(' ', '_')}.${dependency.RefMetadataComponentName.replace(' ', '_')}`));
|
|
20
|
-
const mermaidGraphString = `
|
|
21
|
-
flowchart TD
|
|
22
|
-
${Array.from(dependencyStrings).join('\n')}
|
|
23
|
-
`;
|
|
24
|
-
return this.write('mermaid.graph', mermaidGraphString);
|
|
25
|
-
}
|
|
26
14
|
async write(fileName, data) {
|
|
27
15
|
const path = (0, path_1.join)(this.outputFolder, fileName);
|
|
28
16
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-service.js","sourceRoot":"","sources":["../../src/services/output-service.ts"],"names":[],"mappings":";;;AAAA,+BAAqC;AACrC,0CAAuD;AACvD,2BAA+B;AAG/B,MAAa,aAAa;IAExB,YAAmB,YAAY,GAAG,iBAAiB;QACjD,IAAI,CAAC,YAAY,GAAG,IAAA,cAAO,EAAC,YAAY,CAAC,CAAC;IAC5C,CAAC;IACM,KAAK,CAAC,cAAc,CAAC,cAA6C;QACvE,OAAO,IAAI,CAAC,KAAK,CAAC,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;IAC7E,CAAC;
|
|
1
|
+
{"version":3,"file":"output-service.js","sourceRoot":"","sources":["../../src/services/output-service.ts"],"names":[],"mappings":";;;AAAA,+BAAqC;AACrC,0CAAuD;AACvD,2BAA+B;AAG/B,MAAa,aAAa;IAExB,YAAmB,YAAY,GAAG,iBAAiB;QACjD,IAAI,CAAC,YAAY,GAAG,IAAA,cAAO,EAAC,YAAY,CAAC,CAAC;IAC5C,CAAC;IACM,KAAK,CAAC,cAAc,CAAC,cAA6C;QACvE,OAAO,IAAI,CAAC,KAAK,CAAC,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;IAC7E,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,IAAY;QAChD,MAAM,IAAI,GAAG,IAAA,WAAI,EAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAE/C,IAAI;YACF,MAAM,IAAA,iBAAM,EAAC,IAAI,CAAC,YAAY,EAAE,cAAS,CAAC,IAAI,CAAC,CAAC;SACjD;QAAC,MAAM;YACN,MAAM,IAAA,gBAAK,EAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SAChC;QAED,OAAO,IAAA,oBAAS,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;CACF;AApBD,sCAoBC"}
|
|
@@ -1,28 +1,20 @@
|
|
|
1
1
|
# summary
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Run only related tests
|
|
4
4
|
|
|
5
5
|
# description
|
|
6
6
|
|
|
7
7
|
Calculates the tests needed to be ran based on the changed metadata given using the Salesforce Dependency API
|
|
8
8
|
|
|
9
|
-
# flags.name.summary
|
|
10
|
-
|
|
11
|
-
Description of a flag.
|
|
12
|
-
|
|
13
|
-
# flags.name.description
|
|
14
|
-
|
|
15
|
-
More information about a flag. Don't repeat the summary.
|
|
16
|
-
|
|
17
9
|
# examples
|
|
18
10
|
|
|
19
|
-
|
|
20
|
-
|
|
11
|
+
tests=$(sf delta test-classes --target-org matt@never.io.dev)
|
|
12
|
+
sf project deploy validate ${tests}
|
|
21
13
|
|
|
22
14
|
# flags.target-org.summary
|
|
23
15
|
|
|
24
16
|
The org you want to check the dependencies against.
|
|
25
17
|
|
|
26
|
-
# flags.
|
|
18
|
+
# flags.package-path.summary
|
|
27
19
|
|
|
28
|
-
|
|
20
|
+
Path to the package.xml that will be deployed.
|
package/oclif.manifest.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.0.
|
|
2
|
+
"version": "0.0.22",
|
|
3
3
|
"commands": {
|
|
4
4
|
"delta:test-classes": {
|
|
5
5
|
"id": "delta:test-classes",
|
|
6
|
-
"summary": "
|
|
6
|
+
"summary": "Run only related tests",
|
|
7
7
|
"description": "Calculates the tests needed to be ran based on the changed metadata given using the Salesforce Dependency API",
|
|
8
8
|
"strict": true,
|
|
9
9
|
"pluginName": "sf-delta-tests",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"pluginType": "core",
|
|
12
12
|
"aliases": [],
|
|
13
13
|
"examples": [
|
|
14
|
-
"
|
|
14
|
+
"tests=$(sf delta test-classes --target-org matt@never.io.dev)\nsf project deploy validate ${tests}"
|
|
15
15
|
],
|
|
16
16
|
"flags": {
|
|
17
17
|
"json": {
|
|
@@ -21,15 +21,6 @@
|
|
|
21
21
|
"helpGroup": "GLOBAL",
|
|
22
22
|
"allowNo": false
|
|
23
23
|
},
|
|
24
|
-
"name": {
|
|
25
|
-
"name": "name",
|
|
26
|
-
"type": "option",
|
|
27
|
-
"char": "n",
|
|
28
|
-
"summary": "Description of a flag.",
|
|
29
|
-
"description": "More information about a flag. Don't repeat the summary.",
|
|
30
|
-
"required": false,
|
|
31
|
-
"multiple": false
|
|
32
|
-
},
|
|
33
24
|
"target-org": {
|
|
34
25
|
"name": "target-org",
|
|
35
26
|
"type": "option",
|
|
@@ -38,13 +29,13 @@
|
|
|
38
29
|
"required": true,
|
|
39
30
|
"multiple": false
|
|
40
31
|
},
|
|
41
|
-
"
|
|
42
|
-
"name": "
|
|
32
|
+
"package-path": {
|
|
33
|
+
"name": "package-path",
|
|
43
34
|
"type": "option",
|
|
44
|
-
"char": "
|
|
45
|
-
"summary": "
|
|
46
|
-
"
|
|
47
|
-
"
|
|
35
|
+
"char": "p",
|
|
36
|
+
"summary": "Path to the package.xml that will be deployed.",
|
|
37
|
+
"multiple": false,
|
|
38
|
+
"default": "manifest/package.xml"
|
|
48
39
|
}
|
|
49
40
|
},
|
|
50
41
|
"args": {},
|