sf-delta-tests 0.0.19 → 0.0.21
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 +51 -27
- package/lib/commands/delta/test-classes.js.map +1 -1
- package/lib/elements/object-types.d.ts +8 -0
- package/lib/elements/object-types.js +27 -0
- package/lib/elements/object-types.js.map +1 -0
- 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.js +33 -37
- package/lib/services/dependency-service.js.map +1 -1
- package/lib/services/manifest-service.js +5 -0
- package/lib/services/manifest-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,71 +6,95 @@ 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
|
+
// Download all dependencies from SF
|
|
25
29
|
const combinedApexClassData = await this.dependencyService.getDependenciesByObjects();
|
|
26
|
-
|
|
27
|
-
await
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
console.log({ manifestData });
|
|
30
|
+
// Write into output folder
|
|
31
|
+
await this.outputService.dependencyData(combinedApexClassData);
|
|
32
|
+
// Get manifest data and transform that into a list of metadata
|
|
33
|
+
const manifestData = await this.manifestService.parseManifest(flags['package-path']);
|
|
31
34
|
const changedMetadata = this.manifestService.extractMetadataComponents(manifestData);
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
this.debug({ manifestData: manifestData.components, changedMetadata });
|
|
36
|
+
// If no meaningful changed metadata, no need to run tests (layout changes don't need tests!)
|
|
37
|
+
if (changedMetadata.length === 0) {
|
|
38
|
+
this.debug('No meaningful changed metadata, do not run any tests. (example, layout changes do not need tests ran)');
|
|
39
|
+
this.log(this.cliService.noTests());
|
|
40
|
+
return {
|
|
41
|
+
testNames: [],
|
|
42
|
+
cli: this.cliService.noTests(),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// Too many changes, just run all
|
|
46
|
+
if (changedMetadata.length > 40) {
|
|
47
|
+
this.debug(`Found over 40 changed metadata items (${changedMetadata.length}), running all tests`);
|
|
48
|
+
this.log(this.cliService.allTests());
|
|
49
|
+
return { testNames: [], cli: this.cliService.allTests() };
|
|
50
|
+
}
|
|
51
|
+
// The magic function. From the changed metadata get all the Apex Classes that could be connected to the changed metadata
|
|
34
52
|
const classList = this.dependencyService.getRelatedApexClasses(combinedApexClassData, changedMetadata);
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
this.debug({ testFiles,
|
|
53
|
+
this.debug({ classList });
|
|
54
|
+
// Filter the total class list to only tests
|
|
55
|
+
const testNames = await this.apexClassService.filterApexTest(classList);
|
|
56
|
+
const simpleTestNames = this.apexClassService.filterApexTestSimple(classList);
|
|
57
|
+
this.debug({ testFiles: testNames, simpleTestNames });
|
|
58
|
+
if (testNames.length === 0) {
|
|
59
|
+
this.debug('No relevant tests found, skip running tests');
|
|
60
|
+
// TODO: Debate this one, if we found no relevant tests, should all or none be ran?
|
|
61
|
+
this.log(this.cliService.noTests());
|
|
62
|
+
return {
|
|
63
|
+
testNames: [],
|
|
64
|
+
cli: this.cliService.noTests(),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
this.debug(`Found meaningful and related tests: ${testNames.join(', ')}`);
|
|
40
68
|
// Actual meaningful output
|
|
41
|
-
this.log(
|
|
69
|
+
this.log(this.cliService.specificTests(testNames));
|
|
42
70
|
return {
|
|
43
|
-
|
|
71
|
+
testNames,
|
|
72
|
+
cli: this.cliService.specificTests(testNames),
|
|
44
73
|
};
|
|
45
74
|
}
|
|
46
75
|
catch (e) {
|
|
47
76
|
if (e instanceof Error) {
|
|
48
|
-
this.log('Unknown error');
|
|
49
77
|
this.error([e.toString(), e.name, e.stack].join('\n'), { exit: false });
|
|
50
78
|
}
|
|
51
|
-
|
|
79
|
+
this.log(this.cliService.allTests());
|
|
80
|
+
return { testNames: [], cli: this.cliService.allTests() };
|
|
52
81
|
}
|
|
53
82
|
}
|
|
54
83
|
}
|
|
55
84
|
TestClasses.summary = messages.getMessage('summary');
|
|
56
85
|
TestClasses.description = messages.getMessage('description');
|
|
57
86
|
TestClasses.examples = messages.getMessages('examples');
|
|
87
|
+
// TODO: Add in parameters to tune the max revision depth, max changed metadata
|
|
58
88
|
TestClasses.flags = {
|
|
59
|
-
name: sf_plugins_core_1.Flags.string({
|
|
60
|
-
summary: messages.getMessage('flags.name.summary'),
|
|
61
|
-
description: messages.getMessage('flags.name.description'),
|
|
62
|
-
char: 'n',
|
|
63
|
-
required: false,
|
|
64
|
-
}),
|
|
65
89
|
'target-org': sf_plugins_core_1.Flags.requiredOrg({
|
|
66
90
|
summary: messages.getMessage('flags.target-org.summary'),
|
|
67
91
|
char: 'o',
|
|
68
92
|
required: true,
|
|
69
93
|
}),
|
|
70
|
-
'
|
|
71
|
-
summary: messages.getMessage('flags.
|
|
72
|
-
char: '
|
|
73
|
-
|
|
94
|
+
'package-path': sf_plugins_core_1.Flags.string({
|
|
95
|
+
summary: messages.getMessage('flags.package-path.summary'),
|
|
96
|
+
char: 'p',
|
|
97
|
+
default: 'manifest/package.xml',
|
|
74
98
|
}),
|
|
75
99
|
};
|
|
76
100
|
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,8 @@
|
|
|
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 defaultTypesToFetchFromDependencyServer: string[];
|
|
8
|
+
export declare const meaningfulMetadataChanges: string[];
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.meaningfulMetadataChanges = exports.defaultTypesToFetchFromDependencyServer = 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.defaultTypesToFetchFromDependencyServer = [
|
|
11
|
+
exports.APEX_CLASS,
|
|
12
|
+
exports.APEX_TRIGGER,
|
|
13
|
+
exports.CUSTOM_OBJECT,
|
|
14
|
+
exports.FLOW,
|
|
15
|
+
exports.LIGHTNING_COMPONENT_BUNDLE,
|
|
16
|
+
exports.AURA_DEFINITION_BUNDLE,
|
|
17
|
+
];
|
|
18
|
+
// TODO: Review
|
|
19
|
+
exports.meaningfulMetadataChanges = [
|
|
20
|
+
exports.APEX_CLASS,
|
|
21
|
+
exports.APEX_TRIGGER,
|
|
22
|
+
exports.CUSTOM_OBJECT,
|
|
23
|
+
exports.FLOW,
|
|
24
|
+
exports.LIGHTNING_COMPONENT_BUNDLE,
|
|
25
|
+
exports.AURA_DEFINITION_BUNDLE,
|
|
26
|
+
];
|
|
27
|
+
//# 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;AAEhD,QAAA,uCAAuC,GAAG;IACrD,kBAAU;IACV,oBAAY;IACZ,qBAAa;IACb,YAAI;IACJ,kCAA0B;IAC1B,8BAAsB;CACvB,CAAC;AAEF,eAAe;AACF,QAAA,yBAAyB,GAAG;IACvC,kBAAU;IACV,oBAAY;IACZ,qBAAa;IACb,YAAI;IACJ,kCAA0B;IAC1B,8BAAsB;CACvB,CAAC"}
|
|
@@ -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"}
|
|
@@ -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);
|
|
@@ -40,12 +33,11 @@ class DependencyService {
|
|
|
40
33
|
.filter((dependency) => this.isApexClass(dependencyList, dependency))
|
|
41
34
|
.map((dependency) => dependency.MetadataComponentName));
|
|
42
35
|
}
|
|
43
|
-
// eslint-disable-next-line class-methods-use-this
|
|
44
36
|
isApexClass(dependencyList, dependency) {
|
|
45
37
|
for (const metadata of dependencyList) {
|
|
46
|
-
if ((metadata.MetadataComponentType === APEX_CLASS &&
|
|
38
|
+
if ((metadata.MetadataComponentType === object_types_1.APEX_CLASS &&
|
|
47
39
|
metadata.MetadataComponentName === dependency.MetadataComponentName) ||
|
|
48
|
-
(metadata.RefMetadataComponentType === APEX_CLASS &&
|
|
40
|
+
(metadata.RefMetadataComponentType === object_types_1.APEX_CLASS &&
|
|
49
41
|
metadata.RefMetadataComponentName === dependency.MetadataComponentName)) {
|
|
50
42
|
return true;
|
|
51
43
|
}
|
|
@@ -54,31 +46,37 @@ class DependencyService {
|
|
|
54
46
|
}
|
|
55
47
|
getRelations(allDependencies, relatedDependencies, relationCounter = 0) {
|
|
56
48
|
const newDependencies = Array.from(relatedDependencies);
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
49
|
+
// TODO: Make more efficient, filters are probably not good here
|
|
50
|
+
/* for (const depData of allDependencies.filter((dep) => dep.RefMetadataComponentType === APEX_CLASS)) {
|
|
51
|
+
const matchedDeps = newDependencies.filter(
|
|
52
|
+
(newDep) => newDep.MetadataComponentName === depData.RefMetadataComponentName
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
if (matchedDeps.length > 0) {
|
|
56
|
+
matchedDeps.forEach((matchedDep) => newDependencies.push(matchedDep));
|
|
57
|
+
}
|
|
58
|
+
}*/
|
|
59
|
+
// Should be more efficient than above...
|
|
60
|
+
/* for (const depData of allDependencies) {
|
|
61
|
+
if (depData.RefMetadataComponentType === APEX_CLASS) {
|
|
62
|
+
for (const newDep of newDependencies) {
|
|
63
|
+
if (newDep.MetadataComponentName === depData.RefMetadataComponentName) {
|
|
64
|
+
newDependencies.push(newDep);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}*/
|
|
69
|
+
// Inverse
|
|
70
|
+
for (const newDep of newDependencies) {
|
|
71
|
+
for (const depData of allDependencies) {
|
|
72
|
+
if (newDep.MetadataComponentName === depData.RefMetadataComponentName) {
|
|
73
|
+
if (depData.RefMetadataComponentType === object_types_1.APEX_CLASS) {
|
|
74
|
+
newDependencies.push(depData);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
70
77
|
}
|
|
71
78
|
}
|
|
72
|
-
// eslint-disable-next-line no-console
|
|
73
|
-
console.log('getRelations: after loop');
|
|
74
79
|
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
80
|
// Stop looking at more than 8 layers of relations
|
|
83
81
|
if (relationCounter >= 8) {
|
|
84
82
|
return newDependenciesSet;
|
|
@@ -96,7 +94,6 @@ class DependencyService {
|
|
|
96
94
|
const refDependencies = await this.connection.tooling.query(this.getRefDependencySoql(objectType));
|
|
97
95
|
return (0, kit_1.sortBy)([...dependencies.records, ...refDependencies.records], ['MetadataComponentType', 'RefMetadataComponentType']);
|
|
98
96
|
}
|
|
99
|
-
// eslint-disable-next-line class-methods-use-this
|
|
100
97
|
getDependencySoql(objectType) {
|
|
101
98
|
return `SELECT MetadataComponentName, MetadataComponentType, RefMetadataComponentName, RefMetadataComponentType
|
|
102
99
|
FROM MetadataComponentDependency
|
|
@@ -104,7 +101,6 @@ class DependencyService {
|
|
|
104
101
|
AND MetadataComponentNamespace = NULL
|
|
105
102
|
AND RefMetadataComponentNamespace = NULL`;
|
|
106
103
|
}
|
|
107
|
-
// eslint-disable-next-line class-methods-use-this
|
|
108
104
|
getRefDependencySoql(objectType) {
|
|
109
105
|
return `SELECT MetadataComponentName, MetadataComponentType, RefMetadataComponentName, RefMetadataComponentType
|
|
110
106
|
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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"}
|
|
@@ -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"}
|
|
@@ -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.21",
|
|
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": {},
|